3

簡単な質問があります (私向けではありません)。まず、これを見てください。

$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 のように、on で始まらない限り、それらの属性のままになります。

何か提案があればよろしくお願いします^^! 上級者の方々、ありがとうございます...

4

4 に答える 4

2

PECL はBBCode パッケージを提供しています。PECL パッケージをインストールできない場合は、PEAR パッケージeqivも。BBCode での作業がはるかに簡単になります...一度解決すれば。

于 2011-03-01T02:37:45.793 に答える
1

正規表現が、HTML/JavaScript 関連のセキュリティ問題を阻止する適切なツールになることはめったにありません。

HTML パーサーを使用します

于 2011-03-01T02:17:28.350 に答える
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
于 2011-03-01T03:10:52.370 に答える
0

これは、特に悪意のあるユーザーが JavaScript を難読化する方法が無数にあるため、ブラックリストに登録するよりもホワイトリストに登録する方がはるかに簡単です。受け入れ可能なエントリのリストを作成し、代わりにそこから作業します。はい、技術的にはそこに任意の css エントリを含めることができることは理解していますが、(1) ユーザーが独自の HTML を作成できるようにしたいのはあなたであり、実質的にあらゆる種類の XSS の頭痛の種を招いており、(2) これは単なる問題です。<b>タグなので、許容される css コマンドの小さなサブセットで問題ないはずです。

于 2011-03-01T02:17:22.973 に答える