2013-03-07 167 views
9

所以我一直在使用HTML敏捷性和白名單構建一個C#html消毒器。它的工作原理很好,除了像這樣的情況:如何防止在src等屬性中發生XSS攻擊?

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

我想允許src屬性,只要不是惡意的東西在它明顯。我查閱的所有內容都只是爲標籤及其屬性推薦了一個白名單。你將如何處理這樣的事情?我知道這在任何新的瀏覽器中都不起作用,但我對安全性並不十分熟悉,而且我相信攻擊者可以做的其他一些聰明的事情。

+0

你可以分析每一個輸入或也許URL編碼的URL。但我不確定這是否會阻止XSS。 – rekire 2013-03-07 20:58:16

回答

5

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

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

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

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

準則

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

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

步驟

內容爲了防止跨站點腳本,執行以下步驟:

步驟1.檢查ASP.NET請求驗證已啓用。

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

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

步驟4。查看潛在危險的HTML標籤和屬性。

步驟5。評估對策。

詳情請參閱第二參考。

參考文獻:

Cross-site scripting explained: How to prevent XSS attacks

How To: Prevent Cross-Site Scripting in ASP.NET

0

類似於「必須是有效的Uri,無論是相對的還是絕對的,http/https方案」都是很好的起點。

+0

@ user1652427不確定你的意思是「以XXXX開頭」? 'Uri.Scheme'和'Uri.TryCreate'是我要用的。我強烈懷疑你正在談論使用'string.StartsWith'而不用閱讀和學習[Uri-RFC 3986](http://www.ietf.org/rfc/rfc3986.txt)。 – 2013-03-08 17:25:46

0

如果您正確清理和處理輸入,則可以安全地允許src屬性。爲此,您應該首先通過有效的URL字符白名單canonicalize it對其進行清理,然後驗證它是否指向有效的圖像。

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

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

要驗證您是否指向有效圖像,請打開文件並在前幾個字節中讀取。 不是只是簡單地信任文件擴展名,但在打開文件(爲了性能和安全性)之前請先檢查它。每種圖像格式都有一定的字節模式,您可以檢查。一個很好的look at first is JPEG。它可能仍然是可能的惡意用戶把shellcode的或其他攻擊代碼在 包含正確的頭文件中的圖像文件,但它更困難的事。這將是一個性能瓶頸,所以如果你實施這個計劃,那麼就應該做出適當的計劃。