我有一个会员网站,我们使用非常锁定的精彩fckeditor版本来发布会员内容。最近我们开始允许表情符号,这使得成员们感到高兴,但已经引入了一个潜在的漏洞,因为它现在可以插入来自其他领域的图像,以及我们提供的表情符号。
发布的所有内容都经过预览阶段,在此期间发布的内容已经过消毒,所以我想我需要一些额外的php来删除任何img标签,其中src表示它不是来自我们的域名(让我们说它是“ xyz.com“)。正如drf在第一篇评论中指出的那样,这并不像最初看起来那么简单。
我确信这也适用于其他人,但我没有找到解决方案的运气。正则表达式不是我的强项。一如既往,任何和所有帮助&建议将不胜感激。
答案 0 :(得分:1)
有些人会告诉你,RegExp不是解析HTML / XHTML的正确方法。我是他们其中的一员。请尝试使用XML解析器:
<?php
$dom = new DOMDocument;
$dom->loadHTML(file_get_contents('input.html'));
$xpath = new DOMXpath($dom);
$img = $xpath->query('//img');
foreach($img as $i) {
$url = parse_url($i->getAttribute('src'));
if(isset($url['host']) && in_array($url['host'], array('yourdomain.com', 'www.yourdomain.com')) == false) {
// show an error
// -- or --
// remove the tag: $i->parentNode->removeChild($i)
echo sprintf('[FAIL] %s' . PHP_EOL, $i->getAttribute('src'));
}
else {
echo sprintf('[PASS] %s' . PHP_EOL, $i->getAttribute('src'));
}
}
示例输入:
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
<p><img src="/image.jpg"></p>
<p><img src="http://yourdomain.com/image.jpg"></p>
<p><img src="http://www.yourdomain.com/image.jpg"></p>
<p><img src="http://otherdomain.com/image.jpg"></p>
示例输出:
[PASS] /image.jpg
[PASS] http://yourdomain.com/image.jpg
[PASS] http://www.yourdomain.com/image.jpg
[FAIL] http://otherdomain.com/image.jpg