PDA

Просмотр полной версии : Регулярка - фильтр


RaiDeRz
21.07.2008, 12:32
Кто может помочь с регуляркой.....
Вообще допустим у меня есть входные параметры, там предложение какое-либо.
Мне нужно, чтобы символы a-z A-Z 0-9 а-я А-Я было там разрешены, а также символ ' заменялся на ", вообщем, а все остальное просто удалялось бы, тоесть оставались только разрешенные символы...
Кто-нить знает как это реализовать?

P3L3NG
21.07.2008, 12:38
вот какбэ моя недоделанная статья про фильтр... тебе остается тока отфильтровать то что я не отфильтровал...


Фильтровать я решил следующие опасные или нежелательные сообщения:

1.Тэги html

2.всякие ' & (спецсимволы в ASCII кодировке)

3."<?" - открывающая конструкция в PHP, которая при вставке в сообщение заглючивает весь комментарий И теоретически дает возможность создать какой-либо скрипт на сервере, например шелл (shell, интерпретатор команд, который дает возможность управлять сервером)

4.JavaScript, который дает возможность осуществить XSS-атаку на бедных пользователей сайта

5.Открывающие конструкции скриптов HTML <

6.Пустые сообщения

Итак, цель поставили... Теперь будем ее решать =)

1.После поиска инфы в справочнике по PHP удалось найти функцию strip_tags. Она как раз получает значение строковой переменной (string), ищет в нем все известные html тэги и возвращает скрипту ту же переменную, но без тэгов...

Пример:

<?php

$message = $_POST['text'];

// получаем переменную из формы

strip_tags($message,"тут разрешенные тэги без запятых и пробелов, если надо");

?>

2. Пункт 1 решает проблему и с этими символами

3. Создаем переменную kaka, равную <? и условие, что если текст равен только этим 2 символам, то вывести надпись "Нехрен портить скрипт!"

<?php

$message = $_POST['text'];

$kaka = "<?";

if ($message == $kaka)

{

echo '<br><br><br><center>Не

хренп

ортить

скрипт!

<br><br>

<a href=javascript:history.back()>BACK</a></center>';

exit;

}

// end of filter

?>

4.JavaScript не будет работать, так как PHP автоматически, вставляя его в страницу, режет его слэшами \\, после чего он не работает

Для сайта JS не опасен в принципе, так как работает на пользовательском компе, и для пользователей теперь тоже...

5.За поиск символов в строке отвечает функция strstr. Если она найдет хоть один указанный символ, то возвратит значение true, которое мы и проверим условием и при успешном его выполнении напишем "Нельзя вставлять открывающую конструкцию!"

<?php

$message = $_POST['text'];

//filter by P3L3NG from [Depth Team]

// search

$texta = strstr($message, "<"); //ищем символ <

// end of search

if ($texta == true) {

echo '<br><br><br><center>Нел

ьзявст

авлять

открыв

ающуюк

онстру

кцию<br><br>

<a href=javascript:history.back()>BACK</a></center>';

exit;

}

?>

6.Создаем переменную blank, равную ничему и условие, что если текст равен переменной, то вывести надпись "Все символы отфильтрованы!Сообщение удалено"

<?php

$message = $_POST['text'];

//FUCKING filter by P3L3NG from [Depth Team]

$blank = "";

if ($message == $blank)

{

echo '<br><br><br><center>Все&nbsp;

символы

былиотф

ильтров

аны!Сооб

щениеуд

алено!<br><br>

<a href=javascript:history.back()>BACK</a></center>';

exit;

}

?>

P3L3NG
21.07.2008, 12:39
зы... это фильтр для комментариев на сайте. чтобы опасный код не внедряли в сайт сцуки)

RaiDeRz
21.07.2008, 12:41
Нет... Ты не понял тут уже в 100 раз сложнее.....
Надо это делать через регулярку именно.
Чтобы все символы которые на входят удалялись... Тоесть можно, только: a-z A-Z 0-9 а-я А-Я , . ? !

krypt3r
21.07.2008, 12:44
Что-нить типа

$str =~ y/'/"/;
$str =~ s/[^A-Za-zА-Яа-я0-9"]//g;

В квадратных скобках укажи те символы, которые фильтроваться не должны

RaiDeRz
21.07.2008, 12:58
Хм.... А что делает =~ ?
И кстати как исп. то что ты дал?

RaiDeRz
21.07.2008, 14:38
Вообщем впринципи у меня можно считать получилось выглядит таким образом
public function filter_str($text) {
$search = array("/'/", // Замена ' на "


);
$replace = array('"',


);
$text = preg_replace($search, $replace, $text);
$search = "/[a-zA-Zа-яА-Я0-9\!\,\.\?\ \"\\n]+/";
preg_match_all($search, $text, $text);
$text = implode('', $text[0]);
return $text;
}

krypt3r
21.07.2008, 14:49
RaiDeRz, ну раз ты не указал в первом посте ЯП, я написал регулярку в терминах перла

Helios
21.07.2008, 15:01
Вообщем впринципи у меня можно считать получилось выглядит таким образом
public function filter_str($text) {
$search = array("/'/", // Замена ' на "


);
$replace = array('"',


);
$text = preg_replace($search, $replace, $text);
$search = "/[a-zA-Zа-яА-Я0-9\!\,\.\?\ \"\\n]+/";
preg_match_all($search, $text, $text);
$text = implode('', $text[0]);
return $text;
}
Использовать preg_replace для замены кавычек - то еще извращение. Для этого лучше всего подойдет str_replace:
$str = str_replace("'", '"', $str);

А для удаления лишних символов лучше поступить так:
$text = preg_replace('/[^a-zA-Zа-яА-Я0-9\!\,\.\?\ \"\n]+/', '', $text);
// все, что нам не подходит, заменяем пустым местом, то бишь удаляем

Меньше операций - быстрее работа.

.:EnoT:.
21.07.2008, 15:16
Вообщем впринципи у меня можно считать получилось выглядит таким образом

омг, извращенец...
Намного проще так:
<?php
function str($str){
preg_match_all ('/[a-zA-Zа-яА-Я0-9 \.,\?!"]+/', str_replace ("'", '"', $str), $b);
return implode('', $b[0]);
}

$a = "kldjfw+!897895k ' cvwsk()*&%dfJHYGорШОГлол абвгд'";
echo str($a);
?>
Плюс ко всему восклицательный знак и запятую экранировать не обязательно.