За последние 24 часа нас посетили 19194 программиста и 1646 роботов. Сейчас ищут 998 программистов ...

Обработка данных POST на безопасность

Тема в разделе "PHP для новичков", создана пользователем Jon, 22 май 2008.

  1. Jon

    Jon Активный пользователь

    С нами с:
    24 сен 2007
    Сообщения:
    11
    Симпатии:
    0
    Здравствуйте уважаемые господа !

    Хотел уточнить такой вопрос,
    с формы обратной связи приходят данные пост,
    нашел такую обработку:


    PHP:
    1.  
    2. foreach($_POST as $key => $value)
    3. {
    4.     //сначала делаем обработку, которая не испортит данные,
    5.     //если их придется выводить в форму снова, при ошибке
    6.     $value=trim($value); // убираем пробелы в начале и в конце переменной.
    7.     if (get_magic_quotes_gpc()) $value = stripslashes($value); //убираем слеши, если надо
    8.     $value=htmlspecialchars($value,ENT_QUOTES); //заменяем служебные символы HTML на эквиваленты
    9.     $_POST[$key]=$value; //все изменения записываем в массив $_POST
    10.     //дальше делаем изменения, которые пойдут только в файл,
    11.     //а в форму их выводить не нужно.
    12.     //echo  $value."<br />";
    13.     $value=str_replace("\r","",$value); // заменяем все переводы строк
    14.     //$value=str_replace("\n","<br>",$value); //на <br>
    15.     $_POST[$key]=$value; //и присваиваем новые значения элементам массива $msg.
    16. }
    17.  
    1) такой обработки достаточно, для безопасной записи в базу данных обработаных данных $_POST ?
    2) получается можно заинклудить такую проверку (на всякий случай) на всех страницах чтобы кудабы данные не пришли они обрабатывались, чтобы не заморачиватся с обработкой каждой формы (когда их много), или я неправ?

    Зараннее спасибо.

    (Ps: просьба непинать если подобный вопрос был уже, пользовался поиском - ответа не нашел.)
     
  2. Anonymous

    Anonymous Guest

    данная проверка подходит только для текстовой информации. иногда это может привести к нежелательным результатам.
     
  3. Jon

    Jon Активный пользователь

    С нами с:
    24 сен 2007
    Сообщения:
    11
    Симпатии:
    0
    Тогда вместо 7 строки может написать:

    PHP:
    1. $value= strip_tags($value, '<br>');
    смысл в том чтобы не писать обработчика данных для каждой формы,
    ачтобы данные сами проверялись и чистились от всего лишнего
     
  4. Anonymous

    Anonymous Guest

    что такое «лишнее» в вашем понимании?
     
  5. Jon

    Jon Активный пользователь

    С нами с:
    24 сен 2007
    Сообщения:
    11
    Симпатии:
    0

    PHP HTML теги, JS, SQL запросы и тд - то есть чтобы все потенциально опасно вырезалось (если отправляет хакер или злой конкурент),
    а само сообщение не страдало при этом (если отправляет обычный пользователь)
     
  6. Jon

    Jon Активный пользователь

    С нами с:
    24 сен 2007
    Сообщения:
    11
    Симпатии:
    0
    У меня оканчательный вариант получился такой:

    PHP:
    1.  
    2. if ($_SERVER['REQUEST_METHOD']=='POST')
    3. {
    4.   //обрабатываем полученные переменные.
    5.   foreach($_POST as $key => $value) {
    6.     $value=trim($value); // убираем пробелы в начале и в конце переменной.
    7.     $value= strip_tags($value);  // убираем теги
    8.     if (get_magic_quotes_gpc()) $value = stripslashes($value); //убираем слеши, если надо
    9.     $value=htmlspecialchars($value,ENT_QUOTES); //заменяем служебные символы HTML на эквиваленты
    10.     $value=str_replace("\r","",$value); // заменяем все переводы строк
    11.     $value=str_replace("\n","<br>",$value); //на <br>
    12.     $_POST[$key]=$value; //и присваиваем новые значения элементам массива _POST[$key].
    13.  
    14.   }
    15. }
    Вроде работает

    Есть ли тут опасность ?
     
  7. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Не нужно. Уж очень коряво работает.
    Достаточно.

    \r\n
     
  8. Elkaz

    Elkaz Старожил
    Команда форума Модератор

    С нами с:
    26 июн 2006
    Сообщения:
    3.373
    Симпатии:
    0
    Адрес:
    Баку, Азербайджан
    Одинарная ковычка не фильтруется ;)
    Имхо: У меня GET массив фильтруется жестче, чем POST...
     
  9. Jon

    Jon Активный пользователь

    С нами с:
    24 сен 2007
    Сообщения:
    11
    Симпатии:
    0
    1) насколько коряво, примерчик меня бы сильно убедил, я чесно говоря не заметил корявости,
    единственное что заметил если поставить <?php то с этого места вырезает все, если убрать - записывается в базу и выводится пхп код, но не выполняется

    2) то есть $value= strip_tags($value); - не нужно

    3) \r\n не совсем понял, \n заменить на \r\n - а в чем разница?

    4) Одинарная ковычка не фильтруется - чем это чревато? - вроде работает все

    5) Имхо: У меня GET массив фильтруется жестче, чем POST... - можно примерчик, если не сильно затруднит...