Можно ли загружать ввод данных прямо в класс DOMDocument?

Я создал инструмент, который принимает произвольный HTML, собирает все классы и идентификаторы и выводит их обратно на страницу. Я обеспокоен безопасностью. Я использовал 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 просто ошибается, когда я пытаюсь ввести забавный бизнес, но должен ли я что-то делать для защиты от злонамеренного ввода? Если нет, то почему нет?

Во-вторых, достаточно ли гибкости для санации продукции?

1 ответ

Решение
  1. Нет, он никогда этого не сделает. У вас есть $html в переменной, и вы отправили эту переменную прямо в функцию.

  2. Да, лично я хотел бы использовать htmlspecialchars, но htmlentities прекрасно защищает вас от XSS.

Другие вопросы по тегам