【问题标题】:PHP BBcode using preg_replace() - Prevent users from entering onClick, onKeyPressPHP BBcode 使用 preg_replace() - 防止用户输入 onClick、onKeyPress
【发布时间】:2011-07-06 05:01:55
【问题描述】:

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

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

感谢您的任何建议^^!先谢谢各位了...

【问题讨论】:

  • 你可以做一个允许的属性白名单

标签: php regex bbcode


【解决方案1】:

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

【讨论】:

  • 我将不得不解决问题,并会尽快通知您!谢谢你保利!
【解决方案2】:

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

Use a HTML parser.

【讨论】:

  • 你能帮我解释一下吗?你给我的链接“DOMDocument - Manual”,我没有找到我需要的东西,可能我看不到它!不过谢谢你的回复:)
  • @xx3004 您需要的一切都在那里,但如果不够简单,请尝试使用Googling 获取教程。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    你在玩火,但这应该可以解决你眼前的问题:

    s/\[b(\s*|\s+(?:(?!(?&lt;=\s)on..*?\s*=\s*['"]).)*?)\](.*?)\[\/b\]/&lt;b$1&gt;$2&lt;\/b&gt;/xi

    或 rx = /\[b(\s*|\s+(?:(?!(?&lt;=\s)on..*?\s*=\s*['"]).)*?)\](.*?)\[\/b\]/
    和替换 = &lt;b$1&gt;$2&lt;\/b&gt;

    以及其他一些细微的修复。

    编辑样本[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
    

    【讨论】:

    • 感谢您的回复xD,但是我输入[b onclick="alert('HELLO');"]HELLO[/b]时似乎不起作用,请您帮我检查一下吗?再次感谢您!
    • 嗨@xx。它要么起作用,要么不起作用,似乎没有。如果它不起作用,那么你做错了什么。我正在编辑我的帖子,以使用完全相同的示例使用完全相同的 same 正则表达式建立一个测试用例。请考虑学习正则表达式。
    猜你喜欢
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 2012-04-01
    • 2012-08-24
    • 1970-01-01
    相关资源
    最近更新 更多