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






















