【问题标题】:How to stop BB Code manipulation (part two)?如何停止 BB 代码操纵(第二部分)?
【发布时间】:2010-08-10 17:49:29
【问题描述】:

我最近发现了一个问题,即使用 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);

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

【问题讨论】:

    标签: php security bbcode


    【解决方案1】:
    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

    【讨论】:

    • 这很酷。我不记得 preg_replace_callback 函数。那一定是在相当新的 PHP 版本中?从版本 3 或 4 开始,我一直在断断续续地编写 PHP,而且我不经常返回 php.net 来检查我已经知道的函数,所以我错过了这个。
    • @Zan 从 PHP 4.0.5 开始就存在了,已经发布了 10 多年了。
    • 我做 PHP 这么久了。很容易错过我认为我非常了解的功能中的东西。 :)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-10
        • 2017-03-18
        • 2022-08-03
        • 1970-01-01
        • 2015-05-26
        相关资源
        最近更新 更多