如何转义脚本标签?

时间:2020-04-19 19:42:32

标签: php

这是我的代码:

    // 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);

如您所见,我的代码删除了srchrefalt属性。但是,我的客户端仍然无法抵御XSS攻击,因为用户也可以注入<script>标签(包括内部的一些js代码),我知道如何逃避script标签吗?

1 个答案:

答案 0 :(得分:1)

尽管清理HTML的任务看起来很简单,但事实并非如此。您不能可靠地排除 HTML的某些部分并获得安全的东西。注入不安全内容的方法有很多(我是说这是一种方法),其中大多数您甚至都不会想到。

唯一或多或少安全的方法是维护HTML标签和属性的白名单以及过滤属性的内容。但是由于这是一项艰巨的任务,也许您最好的选择就是使用类似http://htmlpurifier.org/

的东西

甚至更好-不允许任何HTML。例如,如果这是一个选项,请使用Markdown。