PHP « Проверка post и get

Как по вашему лучше проверять REQUEST? Каждый раз как используем или сразу в начале скрипта перебрать весь массив циклом или например так ?

UPD1:Друзья, интерес исключительно академический.

UPD2:
/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .html4strict.geshi_code {font-family:monospace;} .html4strict.geshi_code .imp {font-weight: bold; color: red;} .html4strict.geshi_code .kw2 {color: #000000; font-weight: bold;} .html4strict.geshi_code .kw3 {color: #000066;} .html4strict.geshi_code .es0 {color: #000099; font-weight: bold;} .html4strict.geshi_code .br0 {color: #66cc66;} .html4strict.geshi_code .sy0 {color: #66cc66;} .html4strict.geshi_code .st0 {color: #ff0000;} .html4strict.geshi_code .nu0 {color: #cc66cc;} .html4strict.geshi_code .sc-1 {color: #808080; font-style: italic;} .html4strict.geshi_code .sc0 {color: #00bbdd;} .html4strict.geshi_code .sc1 {color: #ddbb00;} .html4strict.geshi_code .sc2 {color: #009900;} .html4strict.geshi_code span.xtra { display:block; }

GOsha: И зачем вам array_walk_recursive? подойдет array_walk...
 
А затем, что массивы бывают многомерными =)

/** * GeSHi (C) 2004 - 2007 Nigel McNie, 2007 - 2008 Benny Baumann * (http://qbnz.com/highlighter/ and http://geshi.org/) */ .html4strict.geshi_code {font-family:monospace;} .html4strict.geshi_code .imp {font-weight: bold; color: red;} .html4strict.geshi_code .kw2 {color: #000000; font-weight: bold;} .html4strict.geshi_code .kw3 {color: #000066;} .html4strict.geshi_code .es0 {color: #000099; font-weight: bold;} .html4strict.geshi_code .br0 {color: #66cc66;} .html4strict.geshi_code .sy0 {color: #66cc66;} .html4strict.geshi_code .st0 {color: #ff0000;} .html4strict.geshi_code .nu0 {color: #cc66cc;} .html4strict.geshi_code .sc-1 {color: #808080; font-style: italic;} .html4strict.geshi_code .sc0 {color: #00bbdd;} .html4strict.geshi_code .sc1 {color: #ddbb00;} .html4strict.geshi_code .sc2 {color: #009900;} .html4strict.geshi_code span.xtra { display:block; }

aboutmagic: А есть мысли зачем еще может такое понадобиться? :)
 
UPD1. Хотелось посмотреть как люди делают, какие мыслишки у них есть на этот счет.


В общем и целом понял категорическую неприязнь к перебору циклом. И правда зачем? Ведь я же знаю какой код пишу. А если код чужой? Если на вас сваливают самописный проект с кучей дырок в безопасности и говорят срочно их закрыть. Как временное решение мне пришлось использовать перебор циклом (только не бейте ногами! =)). Надеюсь временное не станет постоянным и я в течение недели переберу все скрипты. А пока... Посоветуйте может есть какие проги для анализа кода? А под линукс?

1 ответов


Довольно странный вопрос.
И зачем вам array_walk_recursive? подойдет array_walk или даже просто foreach. А если вы хотите менять массив - то передавайте его по ссылке. Вот тут куча примеров использования array_walk()
Минусы этого метода - проверка абсолютно всех элементов массива, хотя, возможно, из них являются небезопасными 2 или 3.
Все зависит от архитектуры системы.
Вы можете тупо затестить время выполнения различных подходов. Создать большой массив программно, потом проверить скорость выполнения с помощью microtime() на разных исполнениях.
Но вообще, если вы хотите применить одинаковый набор правил к массиву, то по-моему логичнее просто написать функцию, которая бы проверяла и возвращала откорректированное значение.
Вот вам пара простых примеров:
Допустим, функция принимает массив, в котором не может быть элементов < 0
Пример 1 применение одного правила для всех членов массива:


<?php
function clean_in(&$item,$key)
{
    if($item < 0) $item=0;
}
$in = array(1,2,3,-1,-5,6,9,8);
array_walk($in,'clean_in');
?>
 
из минусов - применение одинаковых правил для всего массива, хотя, возможно это для всех и не нужно или невозможно.

Пример 2 применение функции-фильтра:

<?php
function clean_in($item)
{
    if($item < 0)  return 0;
    return $item;
}
$in = array(1,2,3,-1,-5,6,9,8);

somefunction(clean_in($in[2]));
?>
 
более гибкая реализация - вы проверяете только то, что нужно на вход.

Пример 3 - применение foreach - абсолютно понятная фиговина, расписывать не буду - из плюсов - возможность применения уникальных правил по условиям (например по ключу определять какой именно фильтр применить).

Еще посмотрите: array_map() и array_filter()


    public function cleanPost(&$data) {
        return is_array($data) ? array_map(array($this, 'cleanPost'), $data) : htmlspecialchars(stripslashes(trim($data)), ENT_QUOTES);
    }
 

А вообще, если прочитать только первую часть вопроса то я в своих проектах использую вот это


// xxx - индекс (intval) для проверки данных
$qName = (isset($_REQUEST['name'])) ? fChecking($_REQUEST['name'], xxx) : false;

function fChecking($str='', $ind=0, $lend=0){
   switch($ind){
      case 1: // оставляем только число
         $str = intval($str);
         break;
      case 2: // убираем всё лишнее из строки
         $str = strip_tags(trim($str));
         break;
      case 3: // ограничиваем длину строки
         // тут делаем свой обработчик строки тот который нужен
         break;
      case 4: // Экранируем строку
         // тут делаем свой обработчик строки тот который нужен
         break;
      // и так далее и тому подобное
   }
   return $str;
}
 
Думаю логика понятна..

Но вот вторая часть вопроса полностью всё путает :)

Я в своем фреймворке ВСЕГДА чищу REQUEST, POST, GET и COOKIE:


class Krugozor_Http_Request
{
    // ....

    private function __construct()
    {
        $this->request_data = new Krugozor_Http_Cover_Request(self::clearRequest($_REQUEST));
        $this->post_data    = new Krugozor_Cover_Array(self::clearRequest($_POST));
        $this->get_data     = new Krugozor_Cover_Array(self::clearRequest($_GET));
        $this->cookie_data  = new Krugozor_Cover_Array(self::clearRequest($_COOKIE));
    }

    // ....

    /**
     * Очищает массив $in от пробелов и слэшей.
     *
     * @access private
     * @param array
     * @return array
     * @static
     */

    private static function clearRequest(&$in)
    {
        if ($in && is_array($in))
        {
            foreach ($in as $key => $value)
            {
                if (is_array($value))
                {
                    self::clearRequest($in[$key]);
                }
                else
                {
                    $value = trim($value);

                    if (get_magic_quotes_gpc())
                    {
                        $value = stripslashes($value);
                    }

                    $in[$key] = $value;
                }
            }
        }

        return $in;
    }
 

Если POST запрос, то по факту, но конечно если файл обрабатывает не только пост запрос.
А если файл создан специально для POST запроса, то разумеется сразу :-)

Для GET - основные сразу, а второстепенные по мере встречи.
Есть у меня например скрипт, который подключает кучу разных файлов в зависимости от обстоятельств.
Так вот основные запросы, которые нужны для условий подключения и встречаются во всех файлах - обрабатываются сразу. А вот индивидуальные запросы - уже по месту.

Да и мне кажется тут нет какого то очевидного ответа, всё зависит от ситуации.

Ну это так, мнение начинающего быдлокодера.


Встречал в проектах примерно такой код:


foreach($_REQUEST as $k=>$v) {
  $_REQUEST[$k] = trim($v);
}
 

Нужно работать с данными когда нужно работать с ними непосредственно. Нужно число — получили число, нужна строка — получили строку. Фильтровать от всего заранее — плохо. Могут одновременно понадобиться и строки с тэгами(#текст страницы) и строки без тэгов(#заголовок страницы).