За последние 24 часа нас посетили 15218 программистов и 1672 робота. Сейчас ищут 888 программистов ...

Механизм безопасной обработка $_GET, $_POST переменных...

Тема в разделе "Прочие вопросы по PHP", создана пользователем enshtein, 29 фев 2008.

Статус темы:
Закрыта.
  1. enshtein

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

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    собственно сабж в следующем, как удобно и просто получать значения из массивов $_GET или $_POST

    в начале делал так:
    PHP:
    1. $name1 = mysql_escape_string($_POST['name1']);
    2. $name2 = mysql_escape_string($_POST['name2']);
    3. ....
    потом надоело, где-то, скорее всего в мануале :) узнал про функцию extract()
    и стал вместо всех этих строчек делать так:
    PHP:
    1. function escape_string(&$array)
    2. {
    3.     $array = array_map('mysql_escape_string', $array);
    4. }
    5. escape_string($_POST);
    6. extract($_POST);
    далее подумал, а что если злоумышленник скачает страницу себе на комп, добавит в форму поля и изменит значения моих переменных, потому разобравшись изменил на:
    PHP:
    1. function escape_string(&$array)
    2. {
    3.     $array = array_map('mysql_escape_string', $array);
    4. }
    5. escape_string($_POST);
    6. extract($_POST, EXTR_SKIP);
    Таким образом, я получаю удобоваримые переменные из массивов $_POST, $_GET экспортированные в текущую символьную таблицу при этом экраннированные на предмет наличия недопустимых спец-символов :)

    вопрос в том насколько правильно такая техника с позиции безопасности и как вы решаете такие вопросы в своих скриптах?
     
  2. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Использую плейсхолдеры в SQL. Там, если надо, и экранируется.
     
  3. dAllonE

    dAllonE Guest

    Дома корявая недореализация bind SQL.
    На работе часть экранируются при проверке, часть в классе для записи в БД...
     
  4. Vladson

    Vladson Старожил

    С нами с:
    4 фев 2006
    Сообщения:
    4.040
    Симпатии:
    26
    Адрес:
    Estonia, Tallinn
    Глупейшее и опаснейшее решение...

    Правильнее почитать http://phpfaq.ru/slashes и не смешить людей

    Я сам делаю так
    PHP:
    1. <?php
    2. // получаю данные в "чистом" виде
    3. $text = get_magic_quotes_gpc() ? stripslashes($_POST['text']) : $_POST['text'];
    4.  
    5. // a уже в запросе
    6. $sql = 'траляля' . mysql_escape_string($text) . 'три рубля';
    7.  
    8. // потому что фильтровать данные это грех
    9. // они ещё могут понадобиться в чистом виде
    10. // Например для вывода на страничку
    11. echo '<h1>траляля' . htmlspecialchars($text) . 'три рубля</h1>';
    12. ?>
    Для больших проектов это по моему практически единственное решение, а для небольших скриптов это всё равно что из базуки по комарам стрелять...
     
  5. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    PHP:
    1.     $_GET = stripslashes_array($_GET);
    2.     // ...
    3. }
    Отменяем мэджик квотс и дальше всегда, где это необходимо, экранируем.
     
  6. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Очень интересная функиця. Искал, но ничего вразумительного не нашёл.
    У меня 3 вопроса:
    1) Почем в мануале и в 144469 документах (http://php.ru/search/) ничего по запросу "stripslashes_array" не найдено?
    2)Начиная с какой версии PHP она работает?
    3)Есть ли функция addslashes_array (и если есть смотри п.2)?
     
  7. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    PHP:
    1.  
    2. <?php
    3. function stripslashes_array($arr) {
    4. if (!is_array($arr)) return stripslashes($arr);
    5.    $out=array();
    6.    foreach ($arr as $key=>$value) {
    7.        $out[stripslashes($key)]=stripslashes_array($value);
    8.    }
    9. return $out;
    10. }
    11. ?>
    12.  
    Сергей имел в виду, что весь массив гет/пост надо пробегать такой функцией. Написание очевидно и не требует такого удивления.
     
  8. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Это пользовательская функция. Типа:
    PHP:
    1. <?php
    2. function stripslashes_array($array) {
    3.     foreach ($array as &$v) {
    4.         if (is_array($v)) {
    5.             $v = stripslahes_array($v);
    6.         } else {
    7.             $v = stripslashes($v);
    8.         }
    9.     }
    10.  
    11.     return $array;
    12. }
     
  9. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Мдя. Просто я почему-то решил что это встроенная функция =)
     
  10. armadillo

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

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    хех, занятная разница в стиле. )))
     
  11. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    stripslahesh_array говорите? Ну такой пока нету, но она легко имплементируется, причём в двух вариациях
    PHP:
    1. <?php
    2. /**
    3. * Пробегается по исходному масиву и применяет stripshlashes к каждому элементу. Изменяет исходный масив и возращает true в случае удачи, false при неудаче
    4. *
    5. * @param array $array
    6. *
    7. * @return bool
    8. */
    9. function stripslashes_array(&$array){
    10.     return array_walk($array, 'stripslashes');
    11. }
    12.  
    PHP:
    1. <?php
    2.  
    3. /**
    4. * Пробегается по масиву и применяет stripshlashes к каждому элементу. Возвращает новый масив с обработанными данными.
    5. *
    6. * @param array $array
    7. *
    8. * @return array
    9. */
    10. function stripslashes_array($array){
    11.     return array_map('stripslashes', $array);
    12. }
    13.  
     
  12. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Оно работает?
     
  13. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Sergey89
    Если уделять мануалу время не только когда нужно что-то найти но и просто посмотреть что за функции есть в том или ином модуле, что делают и как использовать (а так же прошерстить часть комментов), то работать будет ещё и не такое и в разы быстрее.

    Если кто не заметил, то array_walk принимает массив по ссылке и изменяет сам исходный массив, поэтому моя функция тоже принимает массив по ссылке и возращает bool в первом варианте.\

    Можно взять array_walk_recursive, тогда будут обрабатывается и многомерные масивы, актуально если в POST'е принимаются данные от полей с именами name="myinput[]" когда это превращается в масив.
     
  14. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
     
  15. Sergey89

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

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Некоторые функции PHP работаю тормознутее, чем аналогичное решение на том же PHP. Например, array_map будет работать дольше, чем прямой перебор через foreach.
     
  16. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Sergey89
    У меня это запускается без ошибок
    PHP:
    1. <?php
    2. function stripslashes_array(&$array){
    3.      return array_walk($array, 'stripslashes');
    4. }
    5.  
    6. $array = array('asfsg\ sfdbvfdbv asdva ', 'asfsg\ sfdbvfdbv asdv2 ', 'asfsg\ sfdbvfdbv asd5 ', );
    7. stripslashes_array($array);
    8. echo '<pre>', print_r($array, true), '</pre>';
    Однако есть трабла, что-бы изменить данные масива надо принимать параметр по ссылке, поэтому работать правильно будет только такая вариация
    PHP:
    1. <?php
    2.  
    3. function remove_slashes(&$param){
    4.     $param = stripslashes($param);
    5. }
    6.  
    7. function stripslashes_array(&$array){
    8.      return array_walk($array, 'remove_slashes');
    9. }
    10.  
     
  17. enshtein

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

    С нами с:
    27 авг 2006
    Сообщения:
    291
    Симпатии:
    0
    пока остановился на таком варианте:

    PHP:
    1. function escape($value)
    2. {
    3.     if (function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc()) {
    4.         if (is_array($value)) {
    5.             $value = array_map('mysql_escape_string', $value);
    6.         }
    7.         elseif (!empty($value) && is_string($value)) {
    8.             $value = mysql_escape_string($value);
    9.         }
    10.     }
    11.     return $value;                
    12. }
     
Статус темы:
Закрыта.