我在项目中使用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>
答案 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的每一个人,我恳请您不要将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处理。