Консультация № 141590
16.08.2008, 23:14
0.00 руб.
0 1 1
Доброй ночи...
у меня возникла проблема...не так давно я скачал один скрипт..как я понел он увеличевал безопасность от sql инкции если не ошибаюсь...(скрипт внизу) но недавно возникла проблема....у меня начало высвечиваться на сайте вот это
Код:
 Warning: preg_replace() [function.preg-replace]: Compilation failed: range out of order in character class at offset 12 in inject.php on line 41 
скажите плз в чем проблема? и чем она вызвана?

Приложение:
<?
$sql_pattern = "/SELECT|DROP|UNION|JOIN|UPDATE|INSERT|ALTER|OUTFILE/i";
$html_pattern = "/<.*?(input|textarea|script|body|html|iframe|object|applet|meta|style|form|img|onmouseover|onmouseout|onclick|onfocus|onload).*?>/i";

if (phpversion() < '4.1.0') {
$_GET = $HTTP_GET_VARS;
$_POST = $HTTP_POST_VARS;
$_COOKIE = $HTTP_COOKIE_VARS;
$_REQUEST = array_merge($_GET, $_POST, $_COOKIE);
$_FILES = $HTTP_POST_FILES;
$_SERVER = $HTTP_SERVER_VARS;
}

foreach($_REQUEST as $name=>$value) {
global $$name;
$$name = htmlspecialchars(stripslashes(urldecode(trim($value))), ENT_QUOTES);
}

foreach($_GET as $name=>$value) {
global $$name;
$dec64 = base64_decode(trim($value));
if(preg_match($sql_pattern, $dec64) || preg_match("/<(.*)>/i",$dec64))
$$name = base64_encode(preg_replace("/[^0-9a-z_-]/i", "", strip_tags(preg_replace($sql_pattern, "", $dec64))));
else
$$name = preg_replace($sql_pattern, "", preg_replace("/[^0-9a-z_-]/i", "", strip_tags(urldecode(trim($value)))));
}

foreach($_POST as $name=>$value) {
global $$name;
$$name = urldecode(trim($value));
if (!get_magic_quotes_gpc()) $$name = addslashes($$name);
$$name = preg_replace($sql_pattern, "", preg_replace($html_pattern, "", $$name));
}

foreach($_COOKIE as $name=>$value) {
global $$name;
$dec64 = base64_decode(trim($value));
if(preg_match($sql_pattern, $dec64) || preg_match("/<(.*)>/i",$dec64))
$$name = base64_encode(preg_replace("/[^0-9a-z_-;,]/i", "", strip_tags(preg_replace($sql_pattern, "", $dec64))));
else
$$name = preg_replace($sql_pattern, "", preg_replace("/[^<>0-9a-z_-;,]/i", "", strip_tags(urldecode(trim($value)))));
}

foreach($_FILES as $name=>$value) {
global $$name;
$value = end(explode(".", $_FILES['userfile']['name']));
if (preg_match("/php|php3|php4|php5|php6|js|htm|html|phtml|cgi|pl|perl|asp/i", $value)) unset($_FILES['userfile']['name']);
}
?>

Обсуждение

Неизвестный
19.08.2008, 03:13
общий
это ответ
Здравствуйте, Герасимов Виталий Владиславови!
проблема в регулярном выражении:
"/[^<>0-9a-z_-;,]/i"

знак "-" в символьном классе имеет специальное значение(указывает диапазон символов)
у Вас указано ..._-;... - т.е. диапазон символов от "_" (код 95) до ";"(код 59) - код конечного символа диапазона меньше кода начального символа, отсюда и ошибка.
чтобы включить "-" в символьный класс просто как символ его нужно или экранировать или указывать в начале или конце:
"/[^<>0-9a-z_;,-]/i"
Успехов.
Форма ответа