PHP « Проверка post и get
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: А есть мысли зачем еще может такое понадобиться? :)
В общем и целом понял категорическую неприязнь к перебору циклом. И правда зачем? Ведь я же знаю какой код пишу. А если код чужой? Если на вас сваливают самописный проект с кучей дырок в безопасности и говорят срочно их закрыть. Как временное решение мне пришлось использовать перебор циклом (только не бейте ногами! =)). Надеюсь временное не станет постоянным и я в течение недели переберу все скрипты. А пока... Посоветуйте может есть какие проги для анализа кода? А под линукс?
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 - основные сразу, а второстепенные по мере встречи.
Есть у меня например скрипт, который подключает кучу разных файлов в зависимости от обстоятельств.
Так вот основные запросы, которые нужны для условий подключения и встречаются во всех файлах - обрабатываются сразу. А вот индивидуальные запросы - уже по месту.
Да и мне кажется тут нет какого то очевидного ответа, всё зависит от ситуации.
Ну это так, мнение начинающего быдлокодера.
Нужно работать с данными когда нужно работать с ними непосредственно. Нужно число — получили число, нужна строка — получили строку. Фильтровать от всего заранее — плохо. Могут одновременно понадобиться и строки с тэгами(#текст страницы) и строки без тэгов(#заголовок страницы).