Как избежать тегов сценария? - PullRequest
1 голос
/ 19 апреля 2020

Вот мой код:

    // 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?

1 Ответ

1 голос
/ 19 апреля 2020

Хотя задача очистки HTML кажется простой, это не так. Вы не можете надежно исключить определенные части HTML и получить что-то безопасное. Существует множество (и я имею в виду) способов внедрения небезопасного контента, о большинстве из которых вы даже не задумывались.

Единственный более или менее безопасный способ - это поддерживать белый список HTML теги и атрибуты и атрибуты фильтра содержимого. Но так как это большая задача, возможно, лучшим вариантом будет использовать что-то вроде http://htmlpurifier.org/

или даже лучше - не допускать HTML. Используйте Markdown, например, если это вообще опция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...