我最近发现了一个使用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?
答案 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。