[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Надежная проверка $_GET параметров
gidrosoldat
Алоха!
Хотелось бы побольше узнать о сабже. Кто как проверяет? Какие хитрости? Где подводные камни?

Я пока что тупо перечисляю параметры, проверяю их на НЕ пустоту и потом обрабатываю - либо (int)'oм либо, либо mysql_escape_string'ом.
Если мне надо получить числовые параметры из ГЕТ массива, то получается что то такое:

if(!empty($_GET['id']) && !empty($_GET['rand']) && !empty($_GET['res']) && !empty($_GET['limit']))
{
$random_list = (int)$_GET['rand'];
....

}


Уверен, что и эту длинную соплю из !empty можно покороче написать. Да и все остальное написать как то покрасивее.
Слышал еще о обработке $_GET массивов с помощью регулярки. Кто нибудь так делает?
AlexPHP
Смотря какие данные хотите принять, если числовой тип:

if(is_integer((integer)$_GET['id']) ) { // самый лучший вариант для чисел
$test = (integer) $_GET['id']; // тест пройден
}


Можно регуляркой гонять, ещё лучше.


// проверка чтобы данные были только из чисел и букв
if(preg_match('/([\w\d]+)/', $_GET['str'], $out)) {
// проверено $out[1];
}

/* конечно для вставки строк в БД для экранирования спец-символов
для MySQL - mysql_escape_string
для SQLite - sqlite_escape_string
для PostgreSQL - pg_escape_string
*/

inpost
AlexPHP
(integer) уже приводит к числу, зачем проверять после этого? И при удачной проверке снова приводить в число?
Смотри, что ты написал:
$i = 100;
if($i === 100)
$i = 100;


gidrosoldat
Сократить можно для isset, писать через запятую, для empty - нельзя. Проверять лучше на != '', так как empty будет даже цифра 0, а в твоём примере могут передать по смыслу число 0.
Если ты знаешь, что получишь число, то приведения в число: (int)$var будет достаточно. Если это строка, то при запросе в БД: mysql_real_escape_string. Хотя есть другие варианты, но тут исходить стоит из них.

_____________
Обучаю веб-программированию качественно и не дорого: http://school-php.com
Фрилансер, принимаю заказы: PHP, JS, AS (видео-чаты). Писать в ЛС (Личные сообщения на phpforum).
gidrosoldat
Цитата (inpost @ 29.03.2011 - 20:17)
gidrosoldat
Если ты знаешь, что получишь число, то приведения в число: (int)$var будет достаточно. Если это строка, то при запросе в БД: mysql_real_escape_string. Хотя есть другие варианты, но тут исходить стоит из них.

Я конечно же обрабатываю входящие данные (int)'ом и mysql_real_escape_string'oм - тут проблемы не вижу. Дело в том, что у меня сайт на основе twin'овского движка. Там все $_GET параметры инициализируются тернарным оператором и заносятся в одноименные $GET параметры. То есть isset тут не поможет - $GET параметр в любом случае существует. Но, например, если кто нибудь корявыми ручками сам сотрет из строки браузера $_GET['id'] параметр, то соответственно $GET['id'] окажется пустым, а это черевато ошибками.
По этому я и проверяю перед выполнением скрипта, все ли $GET не являются пустыми. Отсюда и не эстетичная сопля из из нескольких !empty. Незнаю, может есть решение поизящнее, но я его пока не вижу.

Еще такой случай, например, чтение статьи номер один:
браузерная строка - host?page=post&id=1перед началом проверяю:
if($GET['post'] == post && !empty($GET['id']))
...

В принципе все просто, но если я хочу добавить функциональности в скрипт, например, редактировать статью номер один:
браузерная строка - host?page=post&action=edit&id=1
По идее, буду проверять так:
if($GET['post'] == 'post' && $GET['action'] == 'edit' && !empty($GET['id']))
...

Но тогда под эту браузерную строчку подходит и предидущая проверка, перед выполнением простого чтения статьи. Значит для простого чтения, проверку надо менять. Предположительно на :
if($GET['post'] == 'post' && empty($GET['action']) && !empty($GET['id']))
...

Система уже усложнилась, а если функционала будет больше? Все совсем запутается, проверки станут еще длиннее, условия превратятся в ребусы...
Как выходить из такого положения? Неплохим вариантом было бы реализация условия:
Если (есть ТОЛьКО $GET['post'] и $GET['id'] и $GET['id'] не пустой)
- но так вроде бы не напишешь. Или формулировка все же есть? А может в таких случаях надо регулярку использовать?
Вообщем вопросов все больше ...
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.