2011-02-27 113 views
4

htmlentities防止PHP中的XSS的最佳解決方案?此外,我想允許簡單的標籤,如b,i,aimg。什麼是實施這個最好的解決方案?我確實考慮過bbcode,但發現如果執行不當,我也會遇到XSS問題。我該怎麼辦?歡迎任何好的第三方圖書館。PHP防止xss

編輯:

我只是想HTML淨化器,它失敗了這種情況。 Just see this example

+3

它是如何失敗的情況? – gnur 2011-02-27 10:35:27

+0

看看這個網站[https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet](https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet)然後看看這個網站[https ://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet](https://www.owasp.org/index.php/DOM_based_XSS_Prevention_Cheat_Sheet)我認爲這些鏈接也很有趣:[http://code.google。 com/p/owasp-esapi-php /](http://code.google.com/p/owasp-esapi-php/)和[http://code.google.com/p/owasp-esapi-js /](http://code.google.com/p/owasp-esapi-js/) – chris 2013-02-07 23:10:49

回答

3

爲此,我會選擇HTML Purifier,是的,您也可以在那裏指定您的白名單標籤。

HTML淨化器是一個符合標準的 用PHP編寫的HTML過濾器庫。 HTML淨化器不僅會爲一個徹底的審覈移除所有 惡意代碼(更好地稱爲 XSS),
安全又寬容的白名單
,它 也將確保您的文檔 符合標準,有些事只有 與實現有關W3C規範的全面的知識。

我知道在PHP語言一定功能爲,但我寧願一個專門的解決方案來代替。

+0

請參閱我的編輯.. – aWebDeveloper 2011-02-27 10:24:35

1

嘗試使用此代碼(它允許<i><b><del>):

<?php                                            

$html = '<b>Inline <del>context <div>No block allowed <great going </div></del></b>';                       

function escapeEveryOther(&$v, $k) {                                   
    if($k % 2 == 0) {                                       
     $v = htmlspecialchars($v);                                    
    }                                           
}                                            

$parts = preg_split('`(</?(?:b|i|del)>)`is', $html, -1, PREG_SPLIT_DELIM_CAPTURE);                        
array_walk($parts, 'escapeEveryOther');                                   

$html = implode('', $parts);  

然後通過$htmlHTMLPurifier修復不匹配的標籤開口和關閉。