HTML Purifier-iframe和脚本

时间:2019-03-13 09:03:43

标签: php html xss htmlpurifier

我在项目中使用HTML Purifier

我的html是这样的。 (包含简单的html元素+脚本+ iframe)

<p>content...<p>
<iframe></iframe>
<script>alert('abc');</script>
<p>content2</p>

使用默认配置,它变成了

<p>content...</p>
<p></p>
<p>Content2</p>

但是,如果我这样设置配置...

$config->set('HTML.Trusted', true);
$config->set('HTML.SafeIframe', true);

我明白了

<p>content...</p>
<p>
    <iframe></iframe>
    <script type="text/javascript"><!--//--><![CDATA[//><!--
    alert('abc');
    //--><!]]></script>
</p>
<p>content2</p>

无论如何,有没有使用HTML Purifier完全删除“脚本”标签但保留“ iframe”标签的方法?还是HTML Purifier的其他替代方案?

我尝试过

$config->set('Filter.YouTube', true);
$config->set('URI.SafeIframeRegexp', '%^https://(www.youtube.com/embed/|player.vimeo.com/video/)%');

但是事实证明,'script'标签仍然存在。

[编辑]

完整示例。

$config = HTMLPurifier_Config::createDefault();

$html = "<p>content...<p><iframe ...></iframe><script>alert('abc');</script><p>content2</p>";

$config->set(
        'HTML.ForbiddenElements',
        'script'
    );

$purifier = new HTMLPurifier($config);

$clean_html = $purifier->purify($html);

结果

<p>content...</p><p></p><p>content2</p>

2 个答案:

答案 0 :(得分:1)

您处于正确轨道的一半。如果将HTML.SafeIframe设置为true,并将URI.SafeIframeRegexp设置为要接受的URL(%^https://(www.youtube.com/embed/|player.vimeo.com/video/)%可以正常工作),则输入示例为:

<p>content...<p>
<iframe src="https://www.youtube.com/embed/blep"></iframe>
<script>alert('abc');</script>
<p>content2</p>

...变成...

<p>content...</p><p>
<iframe src="https://www.youtube.com/embed/blep"></iframe>

</p><p>content2</p>

说明HTML.SafeIframe允许使用<iframe>标签,但是HTML Purifier仍然希望iframe可以包含的URL列入白名单,否则会出现<iframe>带来了太多的恶意潜力。 URI.SafeIframeRegexp提供了白名单(以需要匹配的正则表达式的形式)。

看看是否适合您!

代码

这是进行我刚才提到的转换的代码:

$dirty = '<p>content...<p>
<iframe src="https://www.youtube.com/embed/blep"></iframe>
<script>alert(\'abc\');</script>
<p>content2</p>';

$config = HTMLPurifier_Config::createDefault();
$config->set('HTML.SafeIframe', true);
$config->set('URI.SafeIframeRegexp', '%^https://(www.youtube.com/embed/|player.vimeo.com/video/)%');

$purifier = new HTMLPurifier($config);

$clean = $purifier->purify($dirty);

关于HTML.Trusted

如果您不完全信任提交HTML的每一个人,我恳请您不要将HTML.Trusted设置为true

除其他事项外,它还允许输入HTML中的表单不受干扰地保留下来,这(如果您要为网站进行纯化,我想是的话)使网络钓鱼攻击变得微不足道。它允许您的输入使用样式标签,这些标签可以毫不费力地保留下来。它仍然会剥离一些东西(HTML Purifier实际上不了解的任何HTML标记,即大多数HTML5标记是其中的一些,以及各种JavaScript属性处理程序),但是您有足够的攻击载体如果您使用此指令,则不要纯化。为Ambush Commander once put it

  

您不应该使用%HTML。它确实应该命名为%HTML.Unsafe之类。

答案 1 :(得分:-2)

考虑使用像Masterminds html5-php这样的功能强大的HTML解析器。这样,就可以对HTML代码进行解析,而不会进行不希望的更改,例如将IFRAME封装在P中,并且您将能够以所需的方式操作生成的DOM树,包括在保留一些其他元素的同时删除一些元素。 >

例如,以下代码可用于从文档中删除SCRIPT个元素:

foreach ($dom->getElementsByTagName('script') as $script) {
    $script->parentNode->removeChild($script);
}

并注意以下代码:

<script type="text/javascript"><!--//--><![CDATA[//><!--
    alert('abc');
//--><!]]></script>`

已过时。现代的HTML5等效代码为:

<script>alert('abc');</script>

与您的源代码完全相同,然后由HTML Purifier处理。