PHP BBcode使用preg_replace() - 防止用户输入onClick,onKeyPress

时间:2011-03-01 02:12:03

标签: php regex bbcode

我有一个简单的问题(不适合我),好的,首先,请看一下:

$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 ......)。

我很感激任何建议^^!谢谢你们先进的......

4 个答案:

答案 0 :(得分:2)

PECL提供BBCode package。另外PEAR package eqiv,如果你不能安装PECL包。一旦你解决了这个问题,你就可以更轻松地使用BBCode了。

答案 1 :(得分:1)

正则表达式很少是阻止HTML / JavaScript相关安全问题的正确工具。

Use a HTML parser

答案 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