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

Статус
В этой теме нельзя размещать новые ответы.

CrashX

В прошлом XSiteCMS
Регистрация
6 Июн 2008
Сообщения
681
Реакции
114
Суть данной темы такова, я не силен в регулярных выражениях, а посему прошу :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;
}
 
Фильтрование и вырезка число int от лишних символов (тип данных целое число)
Как это понять? Если в строке записано число и сделать intval(), то и возвратится число. Ну а если там строка, то будет ноль.

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

Логики фразы Фильтрование и вырезка понять не могу.
 
  • Заблокирован
  • #3
м.... на мой взгляд лучше разрешить всё что можно, а остальное пусть фильтрутся:
т.е. пример тебе известно что в строке должны быть только цифры

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

Собственно всё, ну дальше проверяешь, на разные тебе правила. Как бы помоему так лучше
 
хорошо какие сиволы не когда не должны попасть с СуБД, для того что бы на нерушать ее целостность, и не внедрить вредоносный кон в текст страницы
 
  • Заблокирован
  • #5
ты просто определи что именно у тебя должна содержать, та или иная переменная, а потом уже по этому критерию и фильтруй, в БД можно сувать что тебе угодно, просто на выводе можно так же фильтровать, а что бы не было атаки типа SQL Inj ты должен запретить символы которые выполняют роль операторов в MySQL/SQL. Что непонятно, я не могу понять :/
 
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 кода, незавершенные тэги могут привести к удалению текста, не входящего в тэги. Как решить эти поблемы - можно посмотреть на Для просмотра ссылки Войди или Зарегистрируйся

Добавлено через 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';
}
 
вроде разобрался теперь буду определать типы и длины полей)
и фильтры буду применять по мере не обходиомости, чуть позже выложу свою разработку на обсуждение может чего еще дельного поскажите))

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

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

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

Да, походу более ничего не нужно :), я сам ток учюсь ,так что неругайте :D


PHP:
if($login) 
{ 
if (preg_match("/[0-9a-z_]/i", $login)) 
{ 
// … действия над логином … 
} 
else 
{ 
echo "Логин введен неверно!"; 
} 
} 
else 
{ 
echo "Логин не введен!"; 
}
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху