2009-09-18 210 views
3

防止XSS漏洞的最佳做法是什麼?避免XSS漏洞 - 白名單?

很多人在這裏都提到了白名單,這聽起來像個好主意,但我看到很多人使用RegEx定義白名單。這似乎具有內在缺陷,因爲它取決於許多因素,其中最少的是RegEx的實現和撰寫表達式的人員的技巧不會犯錯誤。因此,很多XSS攻擊成功,因爲他們使用techniques to make the regex accept them

什麼是最好的(雖然可能比正則表白名單更勞動密集型)的方式來避免這些漏洞/消毒用戶輸入?完全消毒用戶輸入在理論上是否可行?

回答

0

過濾XSS的最佳方式取決於您正在開發的平臺。正則表達式可以用於防止多種類型的漏洞,但並不總是最好的。防止XSS在PHP的最佳方法是使用htmlspeicalchars();例如:

反射XSS:

print $_GET['xss']; 

修補:

print htmlspecialchars($_GET['xss'],ENT_QUOTES); 

爲了驗證這一點,我們可以嘗試,並執行一些JavaScript http://127.0.0.1/xss.php?xss=<script>alert(/xss/)</script> 在第一個示例中,我們將看到一個彈出式窗口/ xss /。在補丁的例子,它將顯示字符串的HTML安全版: <腳本>警報(/ XSS /)< /腳本>

真正的問題是不是<和小於>符號時,如果這些被替換分別使用&lt;&gt;,則您可以安全使用XSS。

+2

這是* false * - >「真正的問題是大於<小於> ...如果這些被替換...那麼你是安全的XSS 「。除了你認爲<意味着*大於*的事實之外,你仍然可以擁有xss惡意並在沒有這些字符的情況下被黑客入侵。而且你的代碼不會提醒任何事情,你會丟失標籤。你也應該對它進行網址編碼。 – jspcal 2010-01-22 07:23:09

4

看看AntiXSS庫。

+0

該庫似乎只有負面評論... – 2013-04-15 07:22:36

2

邁克爾的回答是好的,但它會阻止安全的HTML以及危險的輸入。這意味着任何包含HTML格式的輸入(例如<em>)都將以實際的HTML代碼顯示。

如果要接受安全HTML,但塊/過濾危險輸入,然後用測試和驗證的第三方XSS過濾庫像HTMLPurifier:http://htmlpurifier.org/

不要推倒重來,尤其是當它涉及到安全。特別是不要將正則表達式用於XSS白名單。