Регулярка - фильтр

Discussion in 'PHP' started by RaiDeRz, 21 Jul 2008.

  1. RaiDeRz

    RaiDeRz Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    121
    Likes Received:
    5
    Reputations:
    0
    Кто может помочь с регуляркой.....
    Вообще допустим у меня есть входные параметры, там предложение какое-либо.
    Мне нужно, чтобы символы a-z A-Z 0-9 а-я А-Я было там разрешены, а также символ ' заменялся на ", вообщем, а все остальное просто удалялось бы, тоесть оставались только разрешенные символы...
    Кто-нить знает как это реализовать?
     
  2. P3L3NG

    P3L3NG Banned

    Joined:
    4 Jun 2008
    Messages:
    175
    Likes Received:
    204
    Reputations:
    11
    вот какбэ моя недоделанная статья про фильтр... тебе остается тока отфильтровать то что я не отфильтровал...

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

    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;

    }

    ?>
     
  3. P3L3NG

    P3L3NG Banned

    Joined:
    4 Jun 2008
    Messages:
    175
    Likes Received:
    204
    Reputations:
    11
    зы... это фильтр для комментариев на сайте. чтобы опасный код не внедряли в сайт сцуки)
     
  4. RaiDeRz

    RaiDeRz Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    121
    Likes Received:
    5
    Reputations:
    0
    Нет... Ты не понял тут уже в 100 раз сложнее.....
    Надо это делать через регулярку именно.
    Чтобы все символы которые на входят удалялись... Тоесть можно, только:
     
  5. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Что-нить типа
    Code:
    $str =~ y/'/"/;
    $str =~ s/[^A-Za-zА-Яа-я0-9"]//g;
    
    В квадратных скобках укажи те символы, которые фильтроваться не должны
     
    #5 krypt3r, 21 Jul 2008
    Last edited: 21 Jul 2008
    1 person likes this.
  6. RaiDeRz

    RaiDeRz Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    121
    Likes Received:
    5
    Reputations:
    0
    Хм.... А что делает =~ ?
    И кстати как исп. то что ты дал?
     
  7. RaiDeRz

    RaiDeRz Elder - Старейшина

    Joined:
    5 Apr 2007
    Messages:
    121
    Likes Received:
    5
    Reputations:
    0
    Вообщем впринципи у меня можно считать получилось выглядит таким образом
    PHP:
        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;
        }
     
  8. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    RaiDeRz, ну раз ты не указал в первом посте ЯП, я написал регулярку в терминах перла
     
  9. Helios

    Helios Elder - Старейшина

    Joined:
    14 Jan 2007
    Messages:
    414
    Likes Received:
    180
    Reputations:
    103
    Использовать preg_replace для замены кавычек - то еще извращение. Для этого лучше всего подойдет str_replace:
    PHP:
    $str str_replace("'"'"'$str);
    А для удаления лишних символов лучше поступить так:
    PHP:
    $text preg_replace('/[^a-zA-Zа-яА-Я0-9\!\,\.\?\ \"\n]+/'''$text);
    // все, что нам не подходит, заменяем пустым местом, то бишь удаляем
    Меньше операций - быстрее работа.
     
  10. .:EnoT:.

    .:EnoT:. Сексуальное чудовище

    Joined:
    29 May 2007
    Messages:
    803
    Likes Received:
    559
    Reputations:
    50
    омг, извращенец...
    Намного проще так:
    PHP:
    <?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);  
    ?>
    Плюс ко всему восклицательный знак и запятую экранировать не обязательно.