3

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

$msg=preg_replace("/\[b(.*?)\](.*?)\[\/b\]/i", "<b $1>$2</b>", $msg);

好的,在那个正则表达式上,一个 $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]之后的所有属性,只要它们不以on开头(如onClick,onMouseOver ...),该函数将保留这些属性。

我很感激任何建议^^!谢谢各位高手...

4

4 回答 4

2

PECL 提供了一个BBCode 包。还有PEAR 包eqiv,如果你不能安装 PECL 包。将使您更轻松地使用 BBCode……一旦您解决了问题。

于 2011-03-01T02:37:45.793 回答
1

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

使用 HTML 解析器

于 2011-03-01T02:17:28.350 回答
0

这将比黑名单更容易列入白名单,特别是因为恶意用户可以通过多种方式混淆 javascript。我会列出可接受的条目并从那里开始工作。是的,我意识到他们在技术上可以在那里拥有任何 css 条目,但是 (1) 你是希望允许用户创建自己的 HTML 的人,实际上会引起各种 XSS 头痛,并且 (2) 这只是一个<b>标记,因此您应该可以使用一小部分允许的 css 命令。

于 2011-03-01T02:17:22.973 回答
0

您玩火,但这应该可以解决您的直接问题:

s/\[b(\s*|\s+(?:(?!(?<=\s)on..*?\s*=\s*['"]).)*?)\](.*?)\[\/b\]/<b$1>$2<\/b>/xi

或 rx =/\[b(\s*|\s+(?:(?!(?<=\s)on..*?\s*=\s*['"]).)*?)\](.*?)\[\/b\]/
和替换 =<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
于 2011-03-01T03:10:52.370 回答