譯者 | 陳峻
審校 | 孫淑娟
作為一種安全漏洞,跨站點腳本(Cross-site scripting,XSS)是指攻擊者使用客戶端的代碼,在目標(biāo)網(wǎng)站上注入惡意腳本的一種方式。由于攻擊者可以使用它來冒充用戶、訪問敏感數(shù)據(jù),甚至更改網(wǎng)站的頁面內(nèi)容,因此它對用戶、站點構(gòu)成了嚴(yán)重的威脅。
截至2021年,此類風(fēng)險在25個最危險的常見漏洞列表中排名第二。對此,我們往往需要在創(chuàng)建與維護網(wǎng)站時,事先對其有充分的了解,并做好相應(yīng)的防范。
1.跨站點腳本的工作原理
在了解跨站點腳本的工作原理之前,讓我們先來了解同源策略(same-origin policy,SOP)的含義。SOP是一種安全機制策略,它能夠限制一個網(wǎng)站(一個來源)去讀取或?qū)懭肓硪粋€網(wǎng)站(其他來源)。因此,它可以從根源上防止惡意網(wǎng)站向受信任的網(wǎng)站發(fā)送惡意代碼。
跨站點腳本攻擊通常會利用瀏覽器無法區(qū)分合法HTML和惡意代碼的特點,來繞過同源策略。例如,攻擊者可以直接將JavaScript代碼注入目標(biāo)網(wǎng)站。而一旦用戶的瀏覽器執(zhí)行此類代碼,那么攻擊者便可以獲取針對會話令牌、Cookie和其他敏感數(shù)據(jù)的訪問權(quán)限。
目前,攻擊者往往會使用反射、存儲和基于DOM三種類型的跨站點腳本,對目標(biāo)網(wǎng)站開展攻擊。
2.反射型XSS
反射型XSS是將JavaScript直接注入用戶的輸入字段。此類JavaScript可能是Echo、重定向或Cookie收集器。例如,攻擊者將腳本插入到目標(biāo)的搜索詞中,產(chǎn)生諸如搜索結(jié)果等,針對獲取數(shù)據(jù)庫數(shù)據(jù)的請求。一旦目標(biāo)客戶端提交了此類查詢,那么被注入其中的腳本就會立即被觸發(fā)執(zhí)行。例如,在用戶搜索期間,攻擊者可能會插入一個響應(yīng)表單的JavaScript,要求受害者輸入他們的密碼或用戶名。那么一旦用戶認(rèn)為這是來自原始站點的請求,并跟著操作,就可能在不知不覺中將其信任憑據(jù)提交給了攻擊者。有時,攻擊者還可以使用腳本,將用戶從易受攻擊的頁面,重定向到惡意構(gòu)建的頁面上,同樣以提交表單的方式,套取信任憑據(jù)。
3.存儲型XSS
與反射型XSS不同,存儲型XSS以易受攻擊網(wǎng)站的整個用戶群為目標(biāo)。攻擊者通過將腳本存儲在網(wǎng)站的數(shù)據(jù)庫中,在頁面加載時,觸發(fā)存儲腳本的持久執(zhí)行,從而對網(wǎng)站的整體完整性產(chǎn)生影響。
4.基于DOM的XSS
存儲和反射型XSS往往以網(wǎng)站上的服務(wù)器端請求為目標(biāo),而基于DOM的XSS則是以運行時的活動為目標(biāo)。它通過將腳本插入到執(zhí)行特定任務(wù)的網(wǎng)站組件中,以改變其原始意圖。此類組件通常會執(zhí)行更改網(wǎng)站元素等,與DOM相關(guān)的任務(wù),讓網(wǎng)頁變得反應(yīng)異常。
5.如何防范Node中的跨站點腳本
您通常可以采取如下步驟,來防范Node.js中的跨站點腳本:
凈化輸入
由于攻擊者必須能夠?qū)?shù)據(jù)發(fā)送到目標(biāo)Web應(yīng)用,并將其推送給用戶,才能執(zhí)行XSS攻擊,因此,您需要采取的第一種預(yù)防措施便是:對所有從用戶處輸入到Web應(yīng)用的數(shù)據(jù)予以凈化。它可以保證服務(wù)器端在根據(jù)用戶輸入執(zhí)行后續(xù)操作之前,檢測并剔除各種虛假、惡意的“臟”數(shù)據(jù)。您既可以手動執(zhí)行此類操作,也可以使用驗證器(validator)之類的工具,來加快整體的處理速度。如下代碼段所示,您可以使用驗證器來轉(zhuǎn)義用戶輸入中的HTML標(biāo)簽:
importvalidatorfrom"validator";
letuserInput=`Jane<scriptonload="alert('XSShack');"></script>`;
letsanitizedInput=validator.escape(userInput);
一旦您運行了上述代碼,其凈化后的輸出結(jié)果為如下:
Jane<scriptonload="alert('XSShack');"></script>
限制用戶的輸入
通過驗證來限制用戶在表單中可以提交的輸入類型。例如,如果您提供一個電子郵件的輸入字段,那么就只允許用戶輸入正常的電子郵件格式。據(jù)此,您可以最大限度地減少攻擊者提交不良數(shù)據(jù)的可能。當(dāng)然,您也可以在此使用驗證器的相關(guān)代碼包。
實施HTTP-only的Cookie策略
在瀏覽器中,Cookie會將數(shù)據(jù)存儲在本地的緩存中,并通過HTTP的方式,將其發(fā)送回服務(wù)器。不過,它們也很容易成為被攻擊的目標(biāo)。攻擊者完全可以使用JavaScript,通過瀏覽器去訪問它們。
HTTP-only的Cookie是防止客戶端腳本去訪問Cookie里的數(shù)據(jù)的一種策略。也就是說,即使您的Web應(yīng)用包含有可被攻擊者利用的漏洞,他們也無法據(jù)此訪問到Cookie。下面是如何使用Express在Node.js中,實現(xiàn)HTTP-only的Cookie策略的示例:
app.use(express.session({
secret: "secret",
cookie: {
httpOnly: true,
secure: true
}
}))
如上述代碼段所示,如果攻擊者試圖去訪問某個已經(jīng)將httpOnly標(biāo)簽設(shè)置為true的Cookie,那么他們只能收到一個空的字符串。
6.小結(jié)
常言道:知易行難。大多數(shù)Web應(yīng)用運維者都知道網(wǎng)站安全的重要性,但是在實施過程中往往會碰到各種復(fù)雜的狀況。在上文中,我向您簡單介紹了跨站點腳本攻擊的基本原理,以及如何在Node.js中防范此類攻擊。希望上述內(nèi)容能夠給您的網(wǎng)站加固實踐提供幫助。
原文鏈接:https://www.makeuseof.com/prevent-cross-site-scripting-in-nodejs/
譯者介紹
陳峻 (Julian Chen),51CTO社區(qū)編輯,具有十多年的IT項目實施經(jīng)驗,善于對內(nèi)外部資源與風(fēng)險實施管控,專注傳播網(wǎng)絡(luò)與信息安全知識與經(jīng)驗;持續(xù)以博文、專題和譯文等形式,分享前沿技術(shù)與新知;經(jīng)常以線上、線下等方式,開展信息安全類培訓(xùn)與授課。