2008-09-10 93 views

回答

85

暫且不論主題允許一些標籤(不是真正的問題點),僅僅的HTMLEncode不覆蓋所有XSS攻擊。

例如,考慮服務器生成客戶端JavaScript - 服務器動態輸出htmlencoded值直接進入客戶端javascript,htmlencode將不停止注入腳本執行。

其次,考慮下面的僞代碼:

<input value=<%= HtmlEncode(somevar) %> id=textbox> 

現在,在情況下,它不會立即明顯的,如果somevar(由用戶發送的,當然)被設定爲例如

a onclick=alert(document.cookie) 

產生的輸出是

<input value=a onclick=alert(document.cookie) id=textbox> 

哪一個會明顯工作。顯然,這可以(幾乎)任何其他腳本...和HtmlEncode不會有太大的幫助。

還有一些額外的載體需要考慮......包括被稱爲基於DOM的XSS(其中惡意腳本在客戶端動態生成,例如基於#值)的XSS的第三種味道。

而且不要忘了UTF-7型攻擊 - 在進攻看起來像

+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4- 

沒什麼編碼有...

的解決方案,當然(除了適當的和限制性的白名單輸入驗證),是執行上下文敏感編碼:HtmlEncoding是偉大的,如果你是輸出上下文IS HTML,或者你需要JavaScriptEncoding,或VBScriptEncoding,或AttributeValueEncoding,或...等

如果您使用的是MS ASP.NET,則可以使用它們的Anti-XSS庫,它提供了所有必要的上下文編碼方法。

請注意,所有的編碼不應該限制用戶輸入,也可以從數據庫,文本文件存儲的值等

哦,不要忘記明確設置字符集,無論是在HTTP標題和META標籤,否則,你將仍然有UTF-7的漏洞......

一些詳細信息,和一個漂亮的最終名單(不斷更新),檢查了RSnake的小抄:http://ha.ckers.org/xss.html

-1

我不這麼認爲。 Html Encode將所有功能字符(可被瀏覽器解釋爲代碼的字符)轉換爲無法由瀏覽器解析的實體引用,因此無法執行。

&lt;script/&gt; 

以上都無法通過瀏覽器執行。

**除非他們是在瀏覽器中的一個錯誤ofcourse。*

+0

或者,如果JavaScript以某種方式被用來改變用戶輸入的GUI目的。我遇到了一個XSS漏洞,首先編碼爲<>到< and > ......但是當傳遞給這個函數時,它們又被替換了!所以......我想,那就是你的XSS預防。 :) – verix 2008-09-10 10:50:24

3

如果編碼一切會的。 (取決於您的平臺和htmlencode的實現)但是任何有用的Web應用程序都非常複雜,以至於很容易忘記檢查它的每個部分。或者,也許第三方組件不安全。或者,也許你編碼的代碼路徑沒有這樣做,所以你忘了它在別的地方。

所以你可能也想檢查輸入端的東西。你可能想要檢查你從數據庫中讀取的東西。

8

如果您在顯示之前系統地編碼所有用戶輸入,那麼是的,您是安全您仍然不是100%安全。
(見@ Avid的職位有詳細介紹)

另外的問題出現時,你需要讓一些標籤去未編碼的,讓你允許用戶發佈圖片或加粗的文字或需要用戶輸入的任何功能來處理作爲(或轉換成)未編碼的標記。

您必須建立一個決策制定系統,以確定哪些標籤是允許的,哪些不是,並且總是有可能找出讓非允許標籤通過的方法。

如果您按照Joel的建議Making Wrong Code Look Wrong或者如果your language helps you在輸出未處理的用戶數據(靜態類型)時發出警告/未編譯,它會有所幫助。

+0

雖然這包括繞過一些標籤的好處,但問題的答案是錯誤的。看到我的回答... – AviD 2008-09-18 21:04:06

+0

添加了對OP的評論,所以他接受你的回答。並在我的帖子中添加了一個鏈接到您的答案,以防萬一。 – Pat 2008-09-19 08:16:23

1

正如其他人所提到的,只要您在顯示之前編碼全部用戶輸入,您就可以安全使用。這包括從數據庫檢索的所有請求參數和數據,這些數據可以通過用戶輸入進行更改。

由於mentioned by Pat你有時會想顯示一些標籤,而不是所有的標籤。一種常見的方法是使用標記語言,如Textile,MarkdownBBCode。但是,即使標記語言也可能容易受到XSS的影響,請注意。

# Markup example 
[foo](javascript:alert\('bar'\);) 

如果你決定讓「安全」標籤,通過我會建議尋找一些現有的庫來解析&輸出之前清理你的代碼。那裏有a lot of XSS vectors,你必須在你的消毒劑相當安全之前檢測。

1

我第二個metavida的建議找到第三方庫來處理輸出過濾。中和HTML字符是阻止XSS攻擊的好方法。但是,用於轉換元字符的代碼可能容易受到逃避攻擊;例如,如果它沒有正確處理Unicode和國際化。

一個經典的簡單的錯誤自制輸出過濾器使得只捕獲<和>,但錯過像「,它可以打破用戶控制的輸出到HTML標籤的屬性空間,其中Javascript可以附加到DOM。

0

我D喜歡建議HTML淨化器(http://htmlpurifier.org/)它不只是過濾html,它b asically標記並重新編譯它。這是真正的工業實力。

它具有允許您確保有效的html/xhtml輸出的額外好處。

此外,n'thing織物,它是一個偉大的工具,我一直在使用它,但我也會運行它,雖然html淨化器也。

我不認爲你明白我的意思是代幣。 HTML淨化器不只是'過濾',它實際上重建的HTML。 http://htmlpurifier.org/comparison.html

1

不,只是編碼普通的HTML標記不會完全保護您的網站免受XSS攻擊。見,例如,該XSS漏洞google.com的發現:

http://www.securiteam.com/securitynews/6Z00L0AEUE.html

這個類型的漏洞,重要的是,攻擊者可以使用UTF-7編碼他的XSS有效載荷,如果你沒有在頁面上指定不同的字符編碼,用戶的瀏覽器可以解釋UTF-7有效載荷並執行攻擊腳本。

0

你需要檢查的另一件事是你的輸入來自哪裏。您可以使用referrer字符串(大部分時間)來檢查它是否來自您自己的頁面,但是在表單中放入一個隱藏的隨機數字或其他內容,然後檢查它(可能使用會話設置變量)也有助於瞭解輸入來自您自己的網站,而不是一些釣魚網站。