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