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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Безопасная обработка форм

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
neolinux
Отправлено: 22 Января, 2014 - 11:04:41
Post Id


Новичок


Покинул форум
Сообщений всего: 26
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




При использовании приложений полученных из интернета, возникает возможность дыры в безопасности. Вдруг программа не проверила введенные пользователем данные? Решил в начале загрузки проверять весь пользовательский ввод
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. Как лучше проверить?
 
 Top
drfreud
Отправлено: 22 Января, 2014 - 16:25:49
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Янв. 2014  


Помог: 0 раз(а)




Простейший вариант:
PHP:
скопировать код в буфер обмена
  1. if (preg_match("/[^(\w)|(\@)|(\.)|(\-)]/",$usermail)) {
  2.         echo "invalid mail";
  3.         exit;
  4. }

Вобще для проверки мыла регулярка сложнее, но в минимальном виде выглядит примерно так.
 
 Top
IllusionMH
Отправлено: 22 Января, 2014 - 16:34:56
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




neolinux, гляньте в сторону filter_var
 
 Top
neolinux
Отправлено: 30 Января, 2014 - 15:46:55
Post Id


Новичок


Покинул форум
Сообщений всего: 26
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




drfreud пишет:
Простейший вариант:

как затычка, замечательно подходит, но не гарантирует корректного ввода.
dfg@ghj.@lk - пропускает.
 
 Top
teddy
Отправлено: 30 Января, 2014 - 15:53:43
Post Id


Участник


Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013  


Помог: 91 раз(а)




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

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 и все
(Добавление)
а лучше препарированные запросы и нафиг эскейп стринги

(Отредактировано автором: 30 Января, 2014 - 16:00:17)

 
 Top
neolinux
Отправлено: 01 Февраля, 2014 - 07:25:10
Post Id


Новичок


Покинул форум
Сообщений всего: 26
Дата рег-ции: Дек. 2013  


Помог: 0 раз(а)




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 инъекции все же возможны; здесь речь идет именно о параметрах).

Бздительность лишней не бывает?
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB