任意の HTML を受け取り、すべてのクラスと ID を収集してページに出力するツールを作成しました。セキュリティが心配です。HTML Purifier を使用して入力をフィルタリングしていましたが、HTML Purifier がサポートしていない HTML5 をサポートする必要があります。
これはツールの要点です:
$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 は出力をサニタイズするのに十分ですか?