我构建了一个接受任意 HTML 的工具,收集所有类和 id 并将它们输出回页面。我担心安全问题。我一直在使用 HTML Purifier 过滤输入,但我需要支持 HTML5,而 HTML Purifier 不支持。
这是该工具的要点:
$html=$_POST['html'];
$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
$elements = $xpath->query("//body");
foreach ($elements as $element) {
$nodes = $element->childNodes;
$output=write_selectors($nodes);
}
function write_selectors($nodes){
foreach($nodes as $node){
$node->getAttribute('id');
.
.
.
$node->getAttribute('class');
.
.
.
}
.
.
.
return 'string containing all classes and ids in the document'
}
.
.
.
echo htmlentities($output, ENT_QUOTES);
我的问题是:
似乎有人可以将这样的字符串放入工具中:'<div '); do_bad_stuff( 'ha_ha_ha'
最终$doc->loadHTML($html);
会说$doc->loadHTML('<div '); do_bad_stuff( 'ha_ha_ha');
当我尝试输入这样有趣的业务时,似乎 DOMDocument 只是错误,但我应该做些什么来防止恶意输入吗?如果不是,为什么不呢?
其次,htmlentities 是否足以清理输出?