我如何防止src等屬性中的XSS攻擊?

c# html-agility-pack security xss

所以我一直在使用帶有白名單的html敏捷性構建一個C#html清理程序。它工作正常,除了這樣的情況:

<img src="javascript:alert('BadStuff');" />
<img src="jav&#x09;ascript:alert('BadStuff');"> 

我想要允許src屬性,顯然不是其中的惡意內容。我查找過的所有內容都推薦了一個標籤及其屬性的白名單。你怎麼處理這樣的事情呢?我知道這在任何較新的瀏覽器中都不起作用,但我對安全性不是很熟悉,而且我確信攻擊者還可以做一些其他聰明的事情。

一般承認的答案

跨站點腳本(XSS)攻擊通過注入客戶端腳本代碼來利用網頁驗證中的漏洞。使Web應用程序容易受到跨站點腳本攻擊的常見漏洞包括無法正確驗證輸入,無法編碼輸出以及信任從共享數據庫檢索的數據。為了保護您的應用程序免受跨站點腳本攻擊,假設所有輸入都是惡意的。約束並驗證所有輸入。對可能包含HTML字符的所有輸出進行編碼。這包括從文件和數據庫讀取的數據。

當攻擊者編寫腳本以檢索提供對可信站點的訪問的身份驗證cookie然後將cookie發佈到攻擊者已知的Web地址時,會發生跨站點腳本攻擊的最嚴重示例之一。這使攻擊者能夠欺騙合法用戶的身份並獲取對網站的非法訪問權限。

使Web應用程序容易受到跨站點腳本攻擊的常見漏洞包括:

  • 未能約束和驗證輸入。
  • 無法編碼輸出。
  • 信任從共享數據庫檢索的數據。

方針

防止跨站點腳本攻擊的兩個最重要的對策是:

  • 約束輸入。
  • 編碼輸出。

步驟摘要

要防止跨站點腳本,請執行以下步驟:

步驟1.檢查是否已啟用ASP.NET請求驗證。

步驟2.查看生成HTML輸出的ASP.NET代碼。

步驟3.確定HTML輸出是否包含輸入參數。

第4步 。查看具有潛在危險的HTML標記和屬性。

第5步 。評估對策。

有關詳細信息,請參閱第2篇參

參考文獻:

跨站點腳本解釋:如何防止XSS攻擊

如何:防止ASP.NET中的跨站點腳本


熱門答案

只要您正確清理並處理輸入,就可以安全地允許src屬性。要執行此操作,您應首先通過有效URL字符的白名單對其進行清理,對其進行規範化 ,然後驗證它是否指向有效圖像。

你提到的白名單是第一步(也是重要的一步)。要實現白名單,只需刪除對URL無效的每個字符。還要驗證URL是否正確形成,這意味著它指向用戶應該能夠訪問的有效資源。例如,用戶不應通過傳入file://sensitive.txt或其他內容來訪問服務器上的本地文件。如果http或https是唯一應該使用的協議,請檢查URL是否以這些協議開頭。如果你是一個額外的偏執狂,你可以完全拒絕這個請求,因為很明顯它已被篡改。白名單很重要,但單獨使用白名單不會保證功能安全。

規範化非常重要,因為許多攻擊依賴於提交最終將您帶到某個位置的URL,但可能會濫用計算機天生的缺乏推理來獲取它不應該的東西。這也有助於消除可能提高性能的相同資源的重複路徑(或者至少允許您通過不重新檢查自上次檢查後未更改的已知文件來提高性能。請注意這一點,因為可以欺騙最後修改日期,以便攻擊者可以在您已經“檢查並信任”它之後交換惡意文件。

要驗證您是否指向有效映像,請打開該文件並讀入前幾個字節。 不要簡單地相信文件擴展名,雖然先做打開文件之前(性能和安全)檢查。每種圖像格式都有一定的字節模式,您可以檢查。 首先要看的是JPEG 。惡意用戶可能仍然可能將shellcode或其他攻擊代碼放入包含正確標頭的圖像文件中,但這樣做要困難得多。這將是一個性能瓶頸,因此如果您實現這一點,請做好相應的計劃。




許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因