Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Безопасная обработка форм
Форумы портала PHP.SU » » Вопросы новичков » Безопасная обработка форм

Страниц (1): [1]
 

1. neolinux - 22 Января, 2014 - 11:04:41 - перейти к сообщению
При использовании приложений полученных из интернета, возникает возможность дыры в безопасности. Вдруг программа не проверила введенные пользователем данные? Решил в начале загрузки проверять весь пользовательский ввод
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?php
  2. // post cooke session
  3. if(!isset($type))
  4. {
  5.   $temp=array_keys($_GET);
  6.   foreach($temp as $value)
  7.   { // по умолчанию грохаем все
  8.      $_GET[$value]=htmlspecialchars($_GET[$value]); // преобразует html
  9.      $_GET[$value]=escapeshellcmd($_GET[$value]); // экранирует опасные символы
  10.   }
  11. }
  12. elseif($type==='htmltext')
  13. {// поля блогов, где необходим ввод кода
  14.   $temp=array_keys($_GET);
  15.   foreach($temp as $value)
  16.   {
  17.      $_GET[$value]=htmlspecialchars($_GET[$value]); // преобразует html
  18.      $_GET[$value]=addslashes(($_GET[$value]); // экранирует опасные символы
  19.   }
  20. }
  21. elseif($type==='nohtmltext')
  22. {// поля блогов, где удаляем ввод кода
  23.   $temp=array_keys($_GET);
  24.   foreach($temp as $value)
  25.   {
  26.      $_GET[$value]=strip_tags($_GET[$value]); // удаляет html
  27.      $_GET[$value]=addslashes(($_GET[$value]); // экранирует опасные символы
  28.   }
  29. }
  30. elseif($type==='exec')
  31. {
  32.   $temp=array_keys($_GET);
  33.   foreach($temp as $value)
  34.   {
  35.      $_GET[$value]=escapeshellcmd($_GET[$value]); // экранирует опасные символы
  36.   }
  37. }
  38. elseif($type==='sql_v1')
  39. {// поля, учавствующие в sql запросах. первый вариант
  40.   $temp=array_keys($_GET);
  41.   foreach($temp as $value)
  42.   {
  43.      $_GET[$value]=mysql_escape_string($_GET[$value]); // экранирует опасные символы
  44.   }
  45. }
  46. elseif($type==='sql_v2')
  47. {// поля, участвующие в sql запросах. второй вариант
  48.   $temp=array_keys($_GET);
  49.   foreach($temp as $value)
  50.   {
  51.      $_GET[$value]=addslashes(($_GET[$value]); // экранирует опасные символы
  52.   }
  53. }
  54. ?>
Аналогично обрабатывается post, cooke и session. Это лишь базовая проверка, пытающаяся "заткнуть" возможную дырку. Тип поля по умолчанию подойдет для логинов, паролей, других полей анкетирования. Остальные типы описаны в коде. Что я пропусти (типы полей, проверка)? Пожалуй нужно еще тип для email. Как лучше проверить?
2. drfreud - 22 Января, 2014 - 16:25:49 - перейти к сообщению
Простейший вариант:
PHP:
скопировать код в буфер обмена
  1. if (preg_match("/[^(\w)|(\@)|(\.)|(\-)]/",$usermail)) {
  2.         echo "invalid mail";
  3.         exit;
  4. }

Вобще для проверки мыла регулярка сложнее, но в минимальном виде выглядит примерно так.
3. IllusionMH - 22 Января, 2014 - 16:34:56 - перейти к сообщению
neolinux, гляньте в сторону filter_var
4. neolinux - 30 Января, 2014 - 15:46:55 - перейти к сообщению
drfreud пишет:
Простейший вариант:

как затычка, замечательно подходит, но не гарантирует корректного ввода.
dfg@ghj.@lk - пропускает.
5. teddy - 30 Января, 2014 - 15:53:43 - перейти к сообщению
зачем килограм кода что бы отфильтровать гет параметры? эту фабрику "защиты" можно заменить парой строк типа:

PHP:
скопировать код в буфер обмена
  1. $getParams = array_map(function($val){
  2.     return trim(strip_tags($val));
  3. },$_GET);
  4. var_dump($getParams);
  5.  



По поводу E-mail, регулярки тут не нужны. Проверяйте как выше сказали с помощью фильтер вара

PHP:
скопировать код в буфер обмена
  1. if(!filter_var($email, FILTER_VALIDATE_EMAIL)){
  2.      //значит адрес кривой
  3. }


все равно в точности вы не узнаете свой ли адрес ввел пользователь или нет
(Добавление)
И да... если пишем в базу, то в array_map добавите ещё real escape string и все
(Добавление)
а лучше препарированные запросы и нафиг эскейп стринги
6. neolinux - 01 Февраля, 2014 - 07:25:10 - перейти к сообщению
teddy пишет:
$getParams = array_map(function($val){
return trim(strip_tags($val));
},$_GET);
var_dump($getParams);

Цитата:
Parse error: parse error, unexpected T_VARIABLE in T:\home\virtual\nawatar-ru\test.php on line 2

Нужно понимать так?
CODE (htmlphp):
скопировать код в буфер обмена
  1. <?
  2. $getParams = array_map('val',$_GET);
  3. var_dump($getParams);
  4. function val($val){
  5.    return trim(strip_tags($val));
  6. }
  7. ?>

Каким образом здесь можно создать полбзовательский фильтр?
teddy пишет:
а лучше препарированные запросы и нафиг эскейп стринги

Я же чужую программу ставлю! Не я запросы придумывал. Насчет килограмма кода согласен, достаточно одного самого жесткого фильтра, остальное в соответствии с программой.
(Добавление)
teddy пишет:
И да... если пишем в базу, то в array_map добавите ещё real escape string

Для этого соединение с базой уже должно существовать?
(Добавление)
teddy пишет:
а лучше препарированные запросы и нафиг эскейп стринги

http://www.php.net/manual/ru/pdo.prepared-statements.php пишет:
Параметры подготовленного запроса не требуется экранировать кавычками; драйвер это делает автоматически. Если в приложении используются исключительно подготовленные запросы, разработчик может быть уверен, что никаких SQL инъекций случиться не может (однако, если другие части текста запроса записаны с неэкранированными символами, SQL инъекции все же возможны; здесь речь идет именно о параметрах).

Бздительность лишней не бывает?

 

Powered by ExBB FM 1.0 RC1