如何停止BB代码操作(第二部分)?

时间:2010-08-10 17:49:29

标签: php security bbcode

我最近发现了一个使用BB Code输入链接的人能够操纵它们的问题。

他们打算输入类似的东西:

[LINK=http://www.domain.com]example text[/LINK]

然而,他们可以输入类似的东西,使链接颜色变为红色:

[LINK=http://www.domain.com 'span style="color:red;"']example text[/LINK]

这是转换它的代码:

$text = preg_replace("/\[LINK\=(.*?)\](.*?)\[\/LINK\]/is", "<a href='$1' target='_blank'>$2</a>", $text);

其他人非常友好地为一个非常类似的问题提供解决方案,但是他们希望我为此开始一个新问题。他们的解决方案只需要适应。我试过自己,但我真的无法让它发挥作用。 How to stop BB Code manipulation?

3 个答案:

答案 0 :(得分:2)

preg_replace_callback("/\\[LINK\=(.*?)\\\](.*?)\\[\/LINK\\]/is",
    function (array $matches) {
        if (filter_var($matches[1], FILTER_VALIDATE_URL))
            return '<a href="'.
                htmlspecialchars($matches[1], ENT_QUOTES).
                '" target="_blank">'.
                htmlspecialchars($matches[2])."</a>";
        else
            return "INVALID MARKUP";
    }, $text);

使用回调来验证网址,不要忘记htmlspecialchars

答案 1 :(得分:1)

我认为最简单和最好的解决方案可能是通过htmlspecialchars()运行网址以逃避奇怪的字符。这样它就不会直接放入源代码,但会先被转义,因此无法破解href="..."

答案 2 :(得分:1)

使用正则表达式匹配来提取所需的信息,在本例中为链接和链接文本,而不是使用正则表达式替换。

然后以正确的格式写出该信息。这应该消除将奇怪的数据输入输出的机会。

您甚至可以在使用变量之前仔细检查变量,以确保它们不包含任何HTML。