Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

Вычищаем мусор из входных данных (Константин Жинько [tIT])
Author Message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Thu Sep 07, 2006 11:57 pm (написано за 46 минут 51 секунду)
   Post subject: Вычищаем мусор из входных данных
Reply with quote

Code (php): скопировать код в буфер обмена
$type_callbacks = array (www.php.net/array)(
        'i_' => '_to_int',
        'a_' => 'check_params',
        's_' => ''
)

function check_params(&$params)
{
        global (www.php.net/global) $type_callbacks;

        foreach ($params as $key => $value) {
                //
                $prefix = substr (www.php.net/substr)($key, 0, 2);

                //
                if (array_key_exists (www.php.net/array_key_exists)($prefix, $type_callbacks))
                        //
                        $params[$key] = ( !empty (www.php.net/empty)($type_callbacks[$prefix]) && function_exists (www.php.net/function_exists)($type_callbacks[$prefix]) ) ? $type_callbacks[$prefix]($value) : $value;
                //
                else unset (www.php.net/unset)($params[$key]);
        }
}
Эта конструкция окажет незаменимую помощь при проверке входных данных.
Как можно догадаться, каждый параметр должен начинаться с префикса, указанного в $type_callbacks, иначе он будет уничтожен.
Пример обработчика:
Code (php): скопировать код в буфер обмена
function _to_int ($param)
{
        //
        preg_match (www.php.net/preg_match)('/[0-9]*/', $param, $match);
        //
        if (strlen (www.php.net/strlen)($param) != strlen (www.php.net/strlen)($match[0])) $param = null;
        return (int) $param;
}
Ну и способ применения ;)
Code (php): скопировать код в буфер обмена
check_params($_GET);
check_params($_POST);
Решение очень эффектное и позволяет использовать до 26 "человеко-понятных" типов (должен же быть разделитель все-таки). Можно конечно же использовать префиксы разной длины, но регулярное выражение на его выделение будет работать чуть дольше, чем простенький substr. ИМХО.
Жду комментариев и вопросов.

Last edited by Константин Жинько [tIT] on Tue Sep 19, 2006 7:46 pm; edited 1 time in total
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Fri Sep 08, 2006 8:42 am (спустя 8 часов 45 минут; написано за 2 минуты 15 секунд)
   Post subject:
Reply with quote

Константин Жинько [tIT] wrote:
function_exists($type_callbacks[$prefix])
отсутствие обработчика - есть ошибка. а если я опечатался и глаз "замылился" как я буду отлавливать собственные ошибки?
Code (php): скопировать код в буфер обмена
if ( is_callable (www.php.net/is_callable)($callback) ) {
        return call_user_func_array (www.php.net/call_user_func_array)($callback, $args);
} else {
        die (www.php.net/die)('Fatal error: callback is not defined');
}
Back to top
View user's profile Send private message
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Fri Sep 08, 2006 9:08 am (спустя 25 минут; написано за 1 минуту 40 секунд)
   Post subject:
Reply with quote

Константин Жинько [tIT]
А как почекать такую конструкцию
Code (any language): скопировать код в буфер обмена
$_GET:
'a_selectnumbers'=> Array(
    [0] => 1
    [1] => 2
    [2] => 33
    [3] => 44
)
?
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Fri Sep 08, 2006 10:23 am (спустя 1 час 15 минут; написано за 2 минуты 3 секунды)
   Post subject:
Reply with quote

Rumata
Это ж не готовая программа, а только идея ;)

Ksnk
А никак. Вчера уже обсуждали это с моим напарником и пришли к выводу, что не должно быть таких непонятных параметров. Никто не мешает обозвать их так:
Code (php): скопировать код в буфер обмена
'a_selectnumbers'=> Array (www.php.net/array)(
    [i_0] => 1
    [i_1] => 2
    [i_2] => 33
    [i_3] => 44
)
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Fri Sep 08, 2006 10:26 am (спустя 2 минуты; написано за 1 минуту 25 секунд)
   Post subject:
Reply with quote

Rumata wrote:
отсутствие обработчика - есть ошибка
Не так. Для строк мне, например, обработчик не нужен, поэтому он и не вызывается. А если будет нужен, я просто добавлю его (-;
Back to top
View user's profile Send private message
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Fri Sep 08, 2006 10:55 am (спустя 29 минут; написано за 1 минуту 24 секунды)
   Post subject:
Reply with quote

Константин Жинько [tIT]
А как же тогда переменное число параметров, которое элегантно вставляется фенечкой
name='a_array[]' ? Обыдно! :)
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Fri Sep 08, 2006 11:33 am (спустя 37 минут; написано за 1 минуту 58 секунд)
   Post subject:
Reply with quote

Ksnk
Как правило, подобные вещи только в цикле выводятся.
Есть ли принципиальное отличие
Code (php): скопировать код в буфер обмена
<? for ($i =0; $i < 5; $i++) { ?>
<input name="array[]" />
<? } ?>
от
Code (php): скопировать код в буфер обмена
<? for ($i =0; $i < 5; $i++) { ?>
<input name="array[i_<?=$i?>]" />
<? } ?>
?
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Fri Sep 08, 2006 11:35 am (спустя 2 минуты; написано за 13 секунд)
   Post subject:
Reply with quote

Константин Жинько [tIT] wrote:
строк мне, например, обработчик не нужен
такие случаи надо обходить.
вызывать callback-функцию только в том случае если она существует. а перед этим проверить ее валидность
надо обрабатывать только 4 типа переменных
1. строка
2. число
3. файл
4. массив
все остальное от лукавого и являются комбинациями предыдущих
Back to top
View user's profile Send private message
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Fri Sep 08, 2006 11:56 am (спустя 21 минуту; написано за 3 минуты 59 секунд)
   Post subject:
Reply with quote

Константин Жинько [tIT]
O! [] не предполагается использовать вообще? Круто! Прямо ножиком по... живому :)
Хотя решение, в общем-то напрашивается - описать еще один обработчик для префикса, к примеру, 'ai' - массив чисел...
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Fri Sep 08, 2006 12:32 pm (спустя 36 минут; написано за 5 минут 4 секунды)
   Post subject:
Reply with quote

Rumata wrote:
1. строка
2. число
3. файл
4. массив
Воля Ваша ;)

У меня обрабатываются следующие типы:

1. строка (оставляется, как есть)
2. целое (приводится к целому или обнуляется, если выходит за пределы integer)
3. булево (?my, ?my=1, ?my=true - истина; ?my=0, ?my=false, ?my=1231fdsa - ложь)
4. массив (рекурсия)
5. идентификатор объекта (строка только из символов [0-9], не выходящая за пределы INTEGER, объект существует в базе - оставляем, как есть; все остальное - обнуляем)
Ksnk wrote:
Прямо ножиком по... живому :)
Лично я не помню, когда в последний раз использовал эту фичу ;)
И сходу не соображу, где без нее не обойтись %
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Fri Sep 08, 2006 12:36 pm (спустя 3 минуты; написано за 13 секунд)
   Post subject:
Reply with quote

Вопрос: зачем вообще проверять типы?
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Fri Sep 08, 2006 1:35 pm (спустя 59 минут; написано за 1 минуту 21 секунду)
   Post subject:
Reply with quote

Не типы проверять, а переменные на соответствие типам.
Зачем? Повышается устойчивость от DDoS и прочих мелких неприятностей. К тому же дисциплинирует ;)

[offtop]
Кто это тебе так карму-то опустил? %
[/offtop]
Back to top
View user's profile Send private message
WingedFox
Профессионал



Joined: 29 Apr 2003
Posts: 4064
Карма: 268
   поощрить/наказать

Location: Питер

PostPosted: Fri Sep 08, 2006 3:58 pm (спустя 2 часа 22 минуты; написано за 30 секунд)
   Post subject:
Reply with quote

Константин Жинько [tIT]
Посмотрите в сторону sexyForms. Переменные в скрипт ведь не сами по себе приходят =)
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Fri Sep 08, 2006 10:26 pm (спустя 6 часов 28 минут; написано за 4 минуты 28 секунд)
   Post subject:
Reply with quote

Константин Жинько [tIT]
Во-первых, не понимаю, при чем тут DDoS вообще. Слово, что ли, понравилось? :-)
Во-вторых, какие-такие "прочие мелкие неприятности"? Если есть placeholder-ы, их не может быть по определению, т.к. типы и так проверяются базой.

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

Кстати, последнюю проблему (весьма сложную, на самом деле) решает библиотека HTML_MetaForm и техника привязки валидаторов к полям формы, о которой так давно говорили большевики. Скоро будет статья на эту тему.

P.S.
Да, карму кто-то покоцал основательно. Ну и правильно - есть за что, на форуме почти не появляюсь.
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Fri Sep 08, 2006 11:51 pm (спустя 1 час 24 минуты; написано за 2 минуты 7 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
Во-первых, не понимаю, при чем тут DDoS вообще. Слово, что ли, понравилось? :-)
Ошибся. Не DDoS, а DoS - Denial of Service. Ну вот в лом каждый раз проверять входные данные, прежде, чем отдать их в запрос. Вот и написал такую штуку. И дивная, по-моему вещь ;)
Дмитрий Котеров wrote:
решает библиотека HTML_MetaForm и техника привязки валидаторов к полям формы, о которой так давно говорили большевики
А обещал поделиться, когда напишешь - надул (-;
Дмитрий Котеров wrote:
Ну и правильно - есть за что, на форуме почти не появляюсь.
Ну так и я почти не появляюсь ;)
+10 тебе )))
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Sat Sep 09, 2006 10:35 am (спустя 10 часов 43 минуты; написано за 1 минуту 57 секунд)
   Post subject:
Reply with quote

Константин Жинько [tIT] wrote:
Ну вот в лом каждый раз проверять входные данные, прежде, чем отдать их в запрос.
И правильно влом - не надо их проверять. Какая конечная цель проверки? Если безопасность, то ее обеспечивают placeholder-ы на оптимальном слое абстракции. Если же валидация данных, введенных пользователем, то мощности средства явно недостаточно - валидаторов может быть масса (например, ты проверяешь поле на целое число, но почему-то не проверяешь на валидность e-mail, на непустоту, на валидность http-ссылки и т.д.); к тому же - открыт вопрос с форматом вывода сообщений об ошибках.
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Mon Sep 11, 2006 4:25 pm (спустя 2 дня 5 часов 50 минут; написано за 58 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров wrote:
то мощности средства явно недостаточно - валидаторов может быть масса
И каждый добавляется в $type_callbacks.
Дмитрий Котеров wrote:
но почему-то не проверяешь на валидность e-mail, на непустоту, на валидность http-ссылки и т.д.
Потому что в данном проекте мне это не нужно ;)
Дмитрий Котеров wrote:
к тому же - открыт вопрос с форматом вывода сообщений об ошибках.
Открыт.
Константин Жинько [tIT] wrote:
Это ж не готовая программа, а только идея ;)
Back to top
View user's profile Send private message
Юрий Насретдинов
Модератор



Joined: 13 Mar 2003
Posts: 8642
Карма: 198
   поощрить/наказать

Location: 007 495

PostPosted: Mon Sep 11, 2006 5:04 pm (спустя 39 минут; написано за 1 минуту 49 секунд)
   Post subject:
Reply with quote

Не знаю, лично мне идея в принципе нравится :). Это позволяет во многих случаях не думать о том, что будет, если юзверь ввёл "не то", и не поощрять введение "грязных" данных (в идеале, неправильные данные могут прийти только от хакера, т.к. программа должна генерировать нормальные ссылки).
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Mon Sep 11, 2006 5:42 pm (спустя 37 минут; написано за 4 минуты 7 секунд)
   Post subject:
Reply with quote

в идеале валидация данных должна сопровождаться присвоением умолчательных значений.
при этом надо учитывать тот факт, что все входные данные строковые. логика программы определяет тип обрабатываемых данных. имхо допустимы следующие (повторюсь) типы данных
1. строка
2. число
3. булево
4. массив
5. файл

под эти типы данных подпадают все остальные (УРЛы, пароли, даты и адреса электронной почты - все они суть строки), которые можно "валидировать" с помощью callback-функций
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Tue Sep 12, 2006 3:40 am (спустя 9 часов 58 минут; написано за 1 минуту 5 секунд)
   Post subject:
Reply with quote

Rumata
Согласен.
Back to top
View user's profile Send private message
korchasa
Участник форума



Joined: 08 Jun 2006
Posts: 30
Карма: 0
   поощрить/наказать


PostPosted: Wed Sep 13, 2006 12:01 am (спустя 20 часов 20 минут; написано за 5 минут 20 секунд)
   Post subject:
Reply with quote

Смешной вопрос: а если хакер заменит i_ на s_?

Да и закладывать правила валидации входных данных при верстке страницы - странновато как-то...
Back to top
View user's profile Send private message
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Wed Sep 13, 2006 9:58 am (спустя 9 часов 57 минут; написано за 1 минуту 22 секунды)
   Post subject:
Reply with quote

korchasa
Смешной вопрос :) И что плохого может сделать новая, никому неизвестная переменная?
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Wed Sep 13, 2006 12:11 pm (спустя 2 часа 12 минут; написано за 57 секунд)
   Post subject:
Reply with quote

korchasa wrote:
Да и закладывать правила валидации входных данных при верстке страницы - странновато как-то...
При верстке? Я бы вообще головы верстальщикам отрывал за самовольное заполнение name в input и textarea.
Это дело разработчика.
Back to top
View user's profile Send private message
korchasa
Участник форума



Joined: 08 Jun 2006
Posts: 30
Карма: 0
   поощрить/наказать


PostPosted: Wed Sep 13, 2006 1:40 pm (спустя 1 час 28 минут; написано за 7 минут 14 секунд)
   Post subject:
Reply with quote

Ksnk wrote:
korchasa
Смешной вопрос :) И что плохого может сделать новая, никому неизвестная переменная?
Почему "новая, никому не известная"? Было i_id=5, меняем на s_id=[sql-injection на порождение доверчивого кодера]

Константин Жинько [tIT]
В любом случае, при смене типа переменных придется править в двух местах, т.к. предложенная функция даже переменную не чистит от префикса.

ЗЫ: попытка привнести венгерскую нотацию
Back to top
View user's profile Send private message
Ksnk
Участник форума



Joined: 24 Jun 2005
Posts: 459
Карма: 49
   поощрить/наказать

Location: СПб

PostPosted: Wed Sep 13, 2006 2:05 pm (спустя 25 минут; написано за 1 минуту 7 секунд)
   Post subject:
Reply with quote

korchasa wrote:
предложенная функция даже переменную не чистит от префикса.
А вы не думали, что это неспроста?
Back to top
View user's profile Send private message Send e-mail
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Sun Sep 17, 2006 10:43 am (спустя 3 дня 20 часов 37 минут; написано за 4 минуты 4 секунды)
   Post subject:
Reply with quote

korchasa wrote:
Было i_id=5, меняем на s_id=[sql-injection на порождение доверчивого кодера]
И нигде эта s_id не используется - поэтому префикс и не чистится.
korchasa wrote:
при смене типа переменных придется править в двух местах
А зачем править? Проще сразу придумать, какого типа будет переменная, чем экспериментировать.
korchasa wrote:
попытка привнести венгерскую нотацию
В win-api вещь не такая уж бесполезная, ИМХО.
В данном случае префиксы не имеют никакой визуальной нагрузки - переменная таким префиксом они всего лишь указывает программе, к какому типу нужно себя привести.
Back to top
View user's profile Send private message
korchasa
Участник форума



Joined: 08 Jun 2006
Posts: 30
Карма: 0
   поощрить/наказать


PostPosted: Tue Sep 19, 2006 10:34 am (спустя 1 день 23 часа 51 минуту; написано за 12 минут 7 секунд)
   Post subject:
Reply with quote

Константин Жинько [tIT] wrote:
korchasa wrote:
Было i_id=5, меняем на s_id=[sql-injection на порождение доверчивого кодера]
И нигде эта s_id не используется - поэтому префикс и не чистится.
Согласен. Поленился полностью просмотреть код. Извиняюсь
Константин Жинько [tIT] wrote:
korchasa wrote:
при смене типа переменных придется править в двух местах
А зачем править? Проще сразу придумать, какого типа будет переменная, чем экспериментировать.
Придумать, конечно, хорошо, но "все течет, все меняется..."

Еще чуть-чуть замечаний:
  1. не учитывается "нужность" переменных. Т.е. валидацию/фильтрацию проходят все переменные, а не те, которые нужны именно сейчас.
  2. нет значений по-умолчанию
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Tue Sep 19, 2006 7:50 pm (спустя 9 часов 15 минут; написано за 1 минуту 32 секунды)
   Post subject:
Reply with quote

korchasa wrote:
нет значений по-умолчанию
Как это нет?
В фильтре:
Константин Жинько [tIT] wrote:
if (strlen($param) != strlen($match[0])) $param = null;
korchasa wrote:
не учитывается "нужность" переменных.
Вот и подумайте, как это исправить (-;
Back to top
View user's profile Send private message
Дмитрий Котеров
Администратор



Joined: 10 Mar 2003
Posts: 13665
Карма: 413
   поощрить/наказать


PostPosted: Tue Sep 19, 2006 8:33 pm (спустя 42 минуты; написано за 1 минуту 16 секунд)
   Post subject:
Reply with quote

Rumata wrote:
в идеале валидация данных должна сопровождаться присвоением умолчательных значений
Сильно не согласен с этой позицией. Бывают такие поля, для которых просто не может быть (по смыслу) значения по умолчанию - например, e-mail, имя, фамилия и т.д. (чаще сего). Валидация - отдельно, умолчательные значения - отдельно, вывод диагностики - отдельно.
Back to top
View user's profile Send private message Send e-mail
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Tue Sep 19, 2006 10:55 pm (спустя 2 часа 22 минуты; написано за 5 минут 12 секунд)
   Post subject:
Reply with quote

Дмитрий Котеров
необязательные поля обнуляются - обычная практика. иногда присваиваются некоторые "ненулевые" значения
обязательные поля просто ДОЛЖНЫ иметь что-то, и это "что-то" ДОЛЖНО быть валидно: адреса в интернете это соответствующия строка, содержащая валидный URI; Ф.И.О. - непустые строки; и т.д.
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Tue Sep 19, 2006 11:38 pm (спустя 42 минуты; написано за 44 секунды)
   Post subject:
Reply with quote

Rumata wrote:
обязательные поля просто ДОЛЖНЫ иметь что-то, и это "что-то" ДОЛЖНО быть валидно: адреса в интернете это соответствующия строка, содержащая валидный URI; Ф.И.О. - непустые строки; и т.д.
Следовательно, если пользователь их не заполнил, нужно его об этом уведомить, а не придумывать дефолтный e-mail (-;
Но это ИМХО, разумеется..
Back to top
View user's profile Send private message
Rumata
Профессионал



Joined: 17 Aug 2003
Posts: 1850
Карма: 185
   поощрить/наказать


PostPosted: Tue Sep 19, 2006 11:41 pm (спустя 3 минуты; написано за 15 секунд)
   Post subject:
Reply with quote

Константин Жинько [tIT] wrote:
не придумывать дефолтный e-mail
кто-то говорил об этом?
Back to top
View user's profile Send private message
Константин Жинько [tIT]
Сотрудник «Лаборатории»



Joined: 12 Jun 2004
Posts: 2264
Карма: 106
   поощрить/наказать

Location: Москва

PostPosted: Wed Sep 20, 2006 10:58 am (спустя 11 часов 17 минут; написано за 6 минут 8 секунд)
   Post subject:
Reply with quote

Rumata
Видимо, не понял Ваш пост.

В любом случае, валидация данных - это отдельная история.
Back to top
View user's profile Send private message
korchasa
Участник форума



Joined: 08 Jun 2006
Posts: 30
Карма: 0
   поощрить/наказать


PostPosted: Wed Sep 20, 2006 2:13 pm (спустя 3 часа 14 минут; написано за 5 минут 11 секунд)
   Post subject:
Reply with quote

Константин Жинько [tIT] wrote:
Rumata wrote:
обязательные поля просто ДОЛЖНЫ иметь что-то, и это "что-то" ДОЛЖНО быть валидно: адреса в интернете это соответствующия строка, содержащая валидный URI; Ф.И.О. - непустые строки; и т.д.
Следовательно, если пользователь их не заполнил, нужно его об этом уведомить, а не придумывать дефолтный e-mail (-;
Но это ИМХО, разумеется..
Проблема как раз в том, что в данном методе нет разделения понятий фильтрации и валидации. NULL, возвращаемый, при "неудачных" данных, это не значение по умолчанию, а флаг валидации.

ЗЫ: Zend_Filter (framework.zend.com/manual/en/zend.filter.html), ИМХО, наиболее удобен, для фильтрации/валидации
Back to top
View user's profile Send private message
aitkach
Заглянувший



Joined: 24 Mar 2009
Posts: 2
Карма: 0
   поощрить/наказать


PostPosted: Mon Sep 28, 2009 8:19 pm (спустя 3 года 8 дней 6 часов 6 минут; написано за 5 минут 23 секунды)
   Post subject:
Reply with quote

Кто нибудь использовал функцию filter_var_array (ua.php.net/manual/en/function.filter-var-array.php) для фильтрации входных данных?

Пример:
Code (php): скопировать код в буфер обмена
<?php
$_GET = array (www.php.net/array)(
    'a'     => '10',
    'b'      => 'string'
);

$args = array (www.php.net/array)(
    'a' => FILTER_VALIDATE_INT,
    'b'   => FILTER_SANITIZE_ENCODED,
    'c'    => array (www.php.net/array)(
                            'filter' => FILTER_VALIDATE_INT,
                            'flags'  => FILTER_REQUIRE_ARRAY,
              )
);

$myinputs = filter_var_array($_GET, $args);

var_dump (www.php.net/var_dump)($myinputs); //array(3) { ["a"]=>  int(10) ["b"]=>  string(6) "string" ["c"]=>  NULL }
?>
Как видим, если нет элемента $_GET[c], то после фильтрации создается пустой элемент.

Меня интересует: как сделать так, чтобы после фильтрации не создавались элементы массива со значением NULL, если элемента с данным ключом не существует?
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML