0

我有一个会员网站,我们使用一个非常锁定版本的精彩fckeditor来发布会员内容。最近我们开始允许使用笑脸,这让会员很开心,但也引入了一个潜在的漏洞,即现在可以插入来自其他域的图像以及我们提供的笑脸。

发布的所有内容都经过预览阶段,在此期间发布的内容被清理,所以我想我需要一些额外的 php 来删除任何 src 表明它不是来自我们域的 img 标签(假设它是“xyz.com ”)。正如 drf 在第一条评论中指出的那样,这并不像最初看起来那么简单。

我相信这也适用于其他人,但我没有找到解决方案的运气,而且正则表达式不是我的强项。与往常一样,我们将不胜感激任何和所有的帮助和建议。

4

1 回答 1

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
于 2011-08-01T06:49:34.413 回答