2011-02-27 82 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修复不匹配的标签开口和关闭。