1

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

它们旨在输入以下内容:

[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);

其他人很友好地为一个非常相似的问题提供了解决方案,但他们希望我为此提出一个新问题。他们的解决方案只需要适应。我已经尝试过自己,但我真的无法让它发挥作用。 如何停止 BB 代码操纵?

4

3 回答 3

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);

使用回调来验证 URL,不要忘记htmlspecialchars.

于 2010-08-10T17:59:33.823 回答
1

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

于 2010-08-10T17:54:16.593 回答
1

不要使用正则表达式替换,而是使用正则表达式匹配来提取您想要的信息,在这种情况下是链接和链接文本。

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

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

于 2010-08-10T17:55:42.347 回答