这是我的代码:
// to make tags stable, wrap them into <html> tag
$post_content_html = "<html>".$html."</html>";
$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML(mb_convert_encoding($post_content_html, 'HTML-ENTITIES', 'UTF-8'), LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
$xpath = new DOMXPath($dom);
$nodes = $xpath->query('//@*');
foreach ($nodes as $node) {
if($node->nodeName != "src" && $node->nodeName != "href" && $node->nodeName != "alt") {
$node->parentNode->removeAttribute($node->nodeName);
}
}
$post_content_html = $dom->saveHTML($dom->documentElement);
// To strip <html> tag which been wrapped
$post_content_html = preg_replace('/^<html>/', '', $post_content_html);
$post_content_html = preg_replace('/<\/html>$/', '', $post_content_html);
如您所见,我的代码删除了src
,href
和alt
属性。但是,我的客户端仍然无法抵御XSS攻击,因为用户也可以注入<script>
标签(包括内部的一些js代码),我知道如何逃避script
标签吗?
答案 0 :(得分:1)
尽管清理HTML的任务看起来很简单,但事实并非如此。您不能可靠地排除 HTML的某些部分并获得安全的东西。注入不安全内容的方法有很多(我是说这是一种方法),其中大多数您甚至都不会想到。
唯一或多或少安全的方法是维护HTML标签和属性的白名单以及过滤属性的内容。但是由于这是一项艰巨的任务,也许您最好的选择就是使用类似http://htmlpurifier.org/
的东西甚至更好-不允许任何HTML。例如,如果这是一个选项,请使用Markdown。