PHP BBcode с использованием preg_replace () - запретить пользователям входить в onClick, onKeyPress - PullRequest
3 голосов
/ 01 марта 2011

У меня есть простой вопрос (не для меня), хорошо, сначала, пожалуйста, посмотрите на это:

$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 ]

2 голосов
/ 01 марта 2011

PECL предлагает пакет BBCode .Также PEAR пакет eqiv, если вы не можете установить пакеты PECL.Будет намного проще работать с BBCode ... как только вы это сделаете.

1 голос
/ 01 марта 2011

Regex редко бывает подходящим инструментом для решения проблем безопасности, связанных с HTML / JavaScript.

Использование анализатора HTML .

0 голосов
/ 01 марта 2011

Вы играете с огнем, но это должно решить вашу непосредственную проблему:

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
0 голосов
/ 01 марта 2011

Этот белый список будет намного проще, чем черный, особенно из-за множества способов, которыми злоумышленники могут скрыть JavaScript. Я бы сделал список приемлемых записей и работал бы оттуда. Да, я понимаю, что они могли бы технически иметь там любую запись CSS, но (1) вы тот, кто хочет позволить пользователям создавать свой собственный HTML, практически вызывая все виды головной боли XSS, и (2) это только <b>, поэтому вы должны быть в порядке с небольшим подмножеством допустимых команд CSS.

...