Регулярные выражения для фильтрования данных

Тема в разделе "PHP", создана пользователем CrashX, 19 мар 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    Суть данной темы такова, я не силен в регулярных выражениях, а посему прошу :thenks: помощи в этом
    что нужно
    нужно около 10 регулярных выражений для очистки данных, для безопасного добавления в СуБД во избежания все возможных инъекций

    1.Фильтрование и вырезка строки от лишних символов (тип данных строка)
    2.Фильтрование и вырезка число int от лишних символов (тип данных целое число)
    3.Фильтрование и вырезка число float от лишних символов (тип данных дробное число)
    4.Фильтрование и вырезка e-mail от лишних символов (тип данных строка)
    5.Фильтрование и вырезка url от лишних символов (тип данных строка)
    6.Фильтрование и вырезка url (картинки) от лишних символов (тип данных строка)

    и так же предложите регулярные выражения для очистки текста от возможного вредоносного кода

    почти все данные у меня хранятся в массивах)),
    тк все на них построенно, построители запросов и валидароты данных, даже построитель форм частично на них))

    или вот подобных выражений будет достаточно

    PHP:
     /**
    * Удаление символов переноса, возврата каретки, табуляции и слешей "\"
    * @param string
    * @return string
    */
      
    function trim(&$str)
      {
        
    $str=trim($str);
        
    $str=str_replace("\n","",$str);
        
    $str=str_replace("\r","",$str);
        
    $str=str_replace("\t","",$str);
        
    $str=stripslashes($str);
        return 
    $str;
      }
      function 
    trimtag($str)
      {
        
    $str=preg_replace("#\<.+?\>|</.+?\>#is"," ",$str);
        
    $str=preg_replace("/<script/i",'<script',$str);
        
    $str=str_replace("<<","&laquo;",$str);
        
    $str=str_replace(">>","&raquo;",$str);
        
    $str=str_replace("<","&lt;",$str);
        
    $str=str_replace(">","&gt;",$str);
        
    $str=ereg_replace('\\\"',"&quot;",$str);
        
    $str=ereg_replace("\\\'","&quot;",$str);
        
    $str=str_replace("%","%",$str);
        
    $str=str_replace("^ +","",$str);
        
    $str=str_replace(" +$","",$str);
        
    $str=str_replace("|","l",$str);
        
        
    $str=$this->trim($str);
        
    $str=preg_replace("/\\\/",'\',$str);
        return $str;
      }

    /**
    * Удаляет экранирующие бэкслэши в массиве
    * @param array $array
    * @return array $array
    */
    function stripslash(&$array)
    {
    if(is_array($array)): reset($array);
      foreach($array as $key=>$value):
        if(is_array($array[$key])):
          $this->stripslash($array[$key]);
        else:
          $array[$key]=stripslashes($value);
        endif;
      endforeach;
    else:
      $array=stripslashes($array);
    endif;
    return $array;
    }

    **
    * Удаляет экранирующие бэкслэши в массиве
    * @param array $array
    * @return array $array
    */
    function addslash(&$array)
    {
    reset($array);
    foreach($array as $key=>$value):
     if(is_array($array[$key])): $this->addslash($array[$key]);
     else: $array[$key]=str_replace(array("/", "."),array("\\/", "\\."), $folder);
     endif;
    endforeach;
    return $array;
    }
     
  2. t0os

    t0os

    Регистр.:
    21 окт 2007
    Сообщения:
    284
    Симпатии:
    36
    Как это понять? Если в строке записано число и сделать intval(), то и возвратится число. Ну а если там строка, то будет ноль.

    или вам надо следующим образом - заменять все символы, которые не 0-9?

    Логики фразы Фильтрование и вырезка понять не могу.
     
  3. 1d37r

    1d37r Читатель

    Заблокирован
    Регистр.:
    16 сен 2007
    Сообщения:
    288
    Симпатии:
    48
    м.... на мой взгляд лучше разрешить всё что можно, а остальное пусть фильтрутся:
    т.е. пример тебе известно что в строке должны быть только цифры

    //Получем из формы данные (например возраст)
    $age = $_POST['age'];
    //Дальше убераем всё кроме цифр
    $age = ereg_replace("[^0-9]", "", $age);

    Собственно всё, ну дальше проверяешь, на разные тебе правила. Как бы помоему так лучше
     
  4. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    хорошо какие сиволы не когда не должны попасть с СуБД, для того что бы на нерушать ее целостность, и не внедрить вредоносный кон в текст страницы
     
  5. 1d37r

    1d37r Читатель

    Заблокирован
    Регистр.:
    16 сен 2007
    Сообщения:
    288
    Симпатии:
    48
    ты просто определи что именно у тебя должна содержать, та или иная переменная, а потом уже по этому критерию и фильтруй, в БД можно сувать что тебе угодно, просто на выводе можно так же фильтровать, а что бы не было атаки типа SQL Inj ты должен запретить символы которые выполняют роль операторов в MySQL/SQL. Что непонятно, я не могу понять :/
     
  6. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    1.Фильтрование и вырезка строки от лишних символов (тип данных строка)

    В общем случае в строке нет лишних символов, это могут быть любые байты данных с кодом 0..255. Ограничения накладываются способом хранения и способом последующего вывода.
    Вы совершенно верно накладываете ограничения на свои строки, исходя из требований вашей задачи:

    Код:
        $str=trim($str); 
        $str=str_replace("\n","",$str); 
        $str=str_replace("\r","",$str); 
        $str=str_replace("\t","",$str); 
        $str=stripslashes($str); 
    Если переходить на регулярные выражения, то можно было бы предложить следующий фильтр:

    Код:
    $str = ereg_replace("[\000-\037\\]", "", $str);
    удалит все непечатные символы с кодом меньше кода пробела (это коды 0..31 ascii-таблицы) и обратный слэш. Сюда попадают и \n \r \t и многое другое (вертикальная табуляция и т.п.)

    Кроме того, Вы можете удалить тэги html и php:

    Код:
    $str = strip_tags($str);
    Если некоторые теги все же надо оставить. то пишем:

    Код:
    $str = strip_tags($str,'<b><i><u>');
    strip_tags() не проверяет корректность HTML кода, незавершенные тэги могут привести к удалению текста, не входящего в тэги. Как решить эти поблемы - можно посмотреть на http://ru.php.net

    Добавлено через 21 минуту
    2.Фильтрование и вырезка число int от лишних символов (тип данных целое число)

    Будет достаточно применить функцию intval. Вот примеры:

    Код:
    echo intval(42);                      // 42
    echo intval(4.2);                     // 4
    echo intval('42');                    // 42
    echo intval('+42');                   // 42
    echo intval('-42');                   // -42
    echo intval(042);                     // 34
    echo intval('042');                   // 42
    echo intval(1e10);                    // 1410065408
    echo intval('1e10');                  // 1
    echo intval(0x1A);                    // 26
    echo intval(42000000);                // 42000000
    echo intval(420000000000000000000);   // 0
    echo intval('420000000000000000000'); // 2147483647
    3.Фильтрование и вырезка число float от лишних символов (тип данных дробное число)

    Аналогично, будет достаточно применить функцию floatval:

    Код:
    $var = '122.34343The';
    $float_value_of_var = floatval($var);
    echo $float_value_of_var; // 122.34343
    4.Фильтрование и вырезка e-mail от лишних символов (тип данных строка)

    Стоит ли вырезать лишние символы? Обычно просто проверяют адрес на валидность:

    Код:
    if (!preg_match("/^(?:[a-z0-9]+(?:[-_\.]?[a-z0-9]+)?@[a-z0-9]+(?:\.?[a-z0-9]+)?\.[a-z]{2,5})$/i",trim($email))) {
      echo "Неверный e-mail";
    } else {
      echo 'Верный e-mail';
    }
     
  7. CrashX

    CrashX В прошлом XSiteCMS

    Регистр.:
    6 июн 2008
    Сообщения:
    682
    Симпатии:
    112
    вроде разобрался теперь буду определать типы и длины полей)
    и фильтры буду применять по мере не обходиомости, чуть позже выложу свою разработку на обсуждение может чего еще дельного поскажите))

    Добавлено через 8 минут
    да многи из преведеных проверок у меня есть, но я делаю такую вещь как принудительное фильтрование в случае установки определенного флага, для указанного поля, тк из данного поля будут удалны все лишние символя которые не могут присутсвтовать в данном поле если например это число то там не может быть символов, и если это заведомо известно что это строка то там не может быть числел, ну а если это текст то тут уже ряд флагов должен быть например на фильтрование того же html, bbcode, xml, js и css и многого другого
     
  8. jik

    jik

    Регистр.:
    11 мар 2009
    Сообщения:
    243
    Симпатии:
    133
    5.Фильтрование и вырезка url от лишних символов (тип данных строка)

    Предлагаю не избавляться от лишних символов, а посто проверить url на валидность. Проверку можно сделать более или менее строгой, в зависимости от задачи. Вот пример:

    Код:
    $url=trim($url);
    if (strlen($url)==0) echo 'url не задан';
    if (!preg_match("~^(?:(?:https?|ftp|telnet)://(?:[a-z0-9_-]{1,32}".
    "(?::[a-z0-9_-]{1,32})?@)?)?(?:(?:[a-z0-9-]{1,128}\.)+(?:com|net|".
    "org|mil|edu|arpa|gov|biz|info|aero|inc|name|ru|[a-z]{2})|(?!0)(?:(?".
    "!0[^.]|255)[0-9]{1,3}\.){3}(?!0|255)[0-9]{1,3})(?:/[a-z0-9.,_@%&".
    "?+=\~/-]*)?(?:#[^ '\"&<>]*)?$~i",$url,$succ)) {
      echo 'url неверен';
    }
    // если в url на задан протокол, то добавляем
    if (!strstr($url,"://")) $url="http://".$url;
     
  9. Angeli

    Angeli Писатель

    Регистр.:
    6 апр 2009
    Сообщения:
    3
    Симпатии:
    0
    извините что пишу здесь пока темы не могу сама создавать ))у меня на сайте есть регистрация и логин и пароль проверяются регулярным выражением !preg_match("|^[a-z\d]+$|i",$login тогда получается мне уже не нужно проверять ни stripslashes ни htmlspecialchars ни trim? Вопрос наверное глупый)) я пока только учусь.
     
  10. mefish

    mefish Support

    Moderator
    • Супермодератор
    Регистр.:
    30 авг 2007
    Сообщения:
    915
    Симпатии:
    643
    Да, походу более ничего не нужно :), я сам ток учюсь ,так что неругайте :D


    PHP:
    if($login

    if (
    preg_match("/[0-9a-z_]/i"$login)) 

    // … действия над логином … 

    else 

    echo 
    "Логин введен неверно!"


    else 

    echo 
    "Логин не введен!"
     
    Angeli нравится это.
Статус темы:
Закрыта.