我有一个简单的问题(不适合我),好的,首先,请看一下:
$msg=preg_replace("/\[b(.*?)\](.*?)\[\/b\]/i", "<b $1>$2</b>", $msg);
好的,在那个regEXP上,一个$ msg将替换找到的任何东西并将其放入一个新的形式(我不知道如何解释,如何一个例子):
它将转为
[b]TEXT[/b]
到
<b>TEXT</b>
或者它会转向
[b style="color: red;" title="HELLO"]TEXT[/b]
到
<b style="color: red;" title="HELLO">TEXT</b>
问题出现在哪里,如果转变,会发生什么:
[b onclick="SOME TROJAN SCRIPT"]TEXT[/b]
到
<b onclick="SOME TROJAN SCRIPT">TEXT</b>
而我想要做的就是在[b attribute1 attribute2 ... attributeN]之后替换所有属性,而不是那些属性因为它们没有开始(比如onClick,onMouseOver ......)。
我很感激任何建议^^!谢谢你们先进的......
答案 0 :(得分:2)
PECL提供BBCode package。另外PEAR package eqiv,如果你不能安装PECL包。一旦你解决了这个问题,你就可以更轻松地使用BBCode了。
答案 1 :(得分:1)
正则表达式很少是阻止HTML / JavaScript相关安全问题的正确工具。
答案 2 :(得分:0)
白名单比黑名单容易得多,特别是因为恶意用户可以通过无数方式混淆javascript。我会列出可接受的条目并从那里开始工作。是的,我意识到他们可以在技术上有任何css条目,但(1)你是那个想让用户创建自己的HTML,实际上邀请各种XSS头痛,和(2)这只是一个<b>
标记,因此您可以使用一小部分允许的css命令。
答案 3 :(得分:0)
你玩火,但这可以解决你眼前的问题:
s/\[b(\s*|\s+(?:(?!(?<=\s)on..*?\s*=\s*['"]).)*?)\](.*?)\[\/b\]/<b$1>$2<\/b>/xi
或rx = /\[b(\s*|\s+(?:(?!(?<=\s)on..*?\s*=\s*['"]).)*?)\](.*?)\[\/b\]/
和replacement = <b$1>$2<\/b>
以及其他一些微妙的修复。
编辑示例[b onclick="alert('HELLO');"]HELLO[/b]
use strict;
use warnings;
my @samps = (
'[b]TEXT[/b]',
'[b on="]TEXT[/b]',
'[b styleon="color: red;" title="HELLO"]TE
XT[/b]',
'[b onclick="SOME TROJAN SCRIPT"]TEXT[/b]',
'[b onclick="alert(\'HELLO\');"]HELLO[/b]',
);
for (@samps) {
print "Testing $_\n";
if ( s/\[b(\s*|\s+(?:(?!(?<=\s)on..*?\s*=\s*['"]).)*?)\](.*?)\[\/b\]/<b$1>$2<\/b>/si ) {
print " .. passed $_\n";
}
else {
print " .. failed\n";
}
}
输出
Testing [b]TEXT[/b]
.. passed <b>TEXT</b>
Testing [b on="]TEXT[/b]
.. passed <b on=">TEXT</b>
Testing [b styleon="color: red;" title="HELLO"]TE
XT[/b]
.. passed <b styleon="color: red;" title="HELLO">TE
XT</b>
Testing [b onclick="SOME TROJAN SCRIPT"]TEXT[/b]
.. failed
Testing [b onclick="alert('HELLO');"]HELLO[/b]
.. failed