[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Безопасно ли перебирать $_POST форичем?
RAZZOR
Всегда так делал, да и везде в обучающих материалах встречал, что при обработке формы каждая переменная в $_POST обрабатывается отдельно. Т.е. например:
$name = (!empty($POST['name'])) ? $POST['name'] : null;
$content = (!empty($POST['content'])) ? $POST['content'] : null;
// и бла-бла-бла ещё на двести строчек

Так вот, а можно ли этот процесс автоматизировать?
foreach ($POST as $key => $value)
$form_vars[$key] = $value;

Просто я такой записи ещё нигде не встречал. Может у этого метода есть какие-либо серьёзные проблемы с безопасностью или ещё чего? Или я только что допетрил до вполне очевидной вещи, которой и так все пользуются, а во всяких видеоуроках не показывают потому что видеоуроки зло для наглядности? В общем, решил посоветоваться прежде чем натворить делов.

З.Ы. Я совсем недавно на форуме и мне очень стыдно, но как знаки табуляции ставить, чтобы код внешне адекватно выглядел? user posted image



Спустя 56 минут, 57 секунд (4.04.2011 - 03:47) inpost написал(а):
RAZZOR
Отступ привыкли все ставить в 4 пробела, а не через табуляцию.
Посмотри на irbis-team.com , уроки от команды Ирбис. Как раз там что-то вроде твоего, хотя что тебе мешает работать непосредственно уже созданной глобальной переменной: $_POST? Она ведь уже пришла из скрипта, её и используй в скрипте.

Спустя 23 минуты, 47 секунд (4.04.2011 - 04:11) mrpsyx написал(а):
можно сделать так например, чтоб не повторять один и тот же метод


function testPost($post_var)
{
return !empty($post_var) ? $post_var : null;
}


пользоваться так

$name = testPost($_POST['name']);
$content = testPost($_POST['content']);

Спустя 13 минут, 56 секунд (4.04.2011 - 04:25) kirik написал(а):
Цитата (mrpsyx @ 3.04.2011 - 20:11)
можно сделать так например

Нельзя. От нотисов это не избавит

Спустя 12 минут, 35 секунд (4.04.2011 - 04:38) mrpsyx написал(а):
хмм, у меня прекрасно работает...

Спустя 5 минут, 8 секунд (4.04.2011 - 04:43) kirik написал(а):
Цитата (mrpsyx @ 3.04.2011 - 20:38)
хмм, у меня прекрасно работает...

Поставьте error_reporting(E_ALL); в начало скрипта

Спустя 38 минут, 4 секунды (4.04.2011 - 05:21) ИНСИ написал(а):
Вообще, это все не нужно. Переменные надо использовать там, где они нужны.

Спустя 2 часа, 7 минут, 44 секунды (4.04.2011 - 07:29) Белый Тигр написал(а):
Такая массовая обработка поступающих данных, например htmlspecialchars() или mysql_real_escape_string() действительно не нужна. Она может лишь помешать в некоторых ситуациях. Каждую переменную нужно обрабатывать в соответствии с её предназначением.
Кроме того, не забываем что от пользователя в $_POST['var'] может приходить не только строка, но и многомерный массив wink.gif

Спустя 8 минут, 44 секунды (4.04.2011 - 07:37) alex12060 написал(а):
А если $POST пустой? Это как минимум некоректное отображение...

Спустя 31 минута, 6 секунд (4.04.2011 - 08:09) RAZZOR написал(а):
Цитата
Посмотри на irbis-team.com , уроки от команды Ирбис.

Уже видел, отличные материалы. Почерпнул для себя много мелочей, не затронутых в "видеоуроках". Собственно из-за этого я и оказался на этом форуме. Ибо на локальном компе у меня стоит EasyPHP, я на нём напрограммировал себе довольно таки объеный сайт, а когда залил на хостинг, то столкнулся с проблемами. Ибо не работали нормально ни инклуды, ни автолоад, ни наследственность классов. В общем придётся многие моменты переделывать

Цитата
Вообще, это все не нужно. Переменные надо использовать там, где они нужны.

В общем то, как раз таки нужно. Допустим есть у меня контроллер добавления новости. И надо, чтобы в случае ошибки вноса данных в базу, пользователь получил обратно то, что он успел навводить. В конце контроллера у меня функция вывода в шаблон (работает через ob_start() и ob_get_Clean() ), которая принимает собственно файл шаблона и переменные, которые он будет использовать (чтобы ограничить видимость переменных). Так вот, если у меня 20 полей в форме, то придётся в контроллере писать
$vars = array('title' => $title, 'date' => $date, 'author' => $author) 
// и т.д

Намного же проще сделать массив $form_vars, задать все переменные в него, а потом в шаблоне выводить <?php echo $form_vars['name']; ?>
Логика скрипта у меня примерно такая:
// Для всех значений, используемых в форме, устанавливаем значение по умолчанию (пустыми)
$form_vars['title'] = '';
$form_vars['content'] = '';
// и т.д.

// Если поступили данные - обрабатываем

if (isset($_POST['content'], /* и все поля, подлежащие обязательному заполнению */ ))
{
if ( AddNewsItem(/* все поля */) )
{
// редиректим юзверя, показывая ему, что новость добавлена. Умираем
}

// Если мы оказались здесь, то AddNewsItem вернула false. Так она делает, если юзверь не заполнил важные поля. Переопределяем form_vars
$form_vars['title'] = $_POST['title'];
$form_vars['content'] = $_POST['content'];
}

// Выводим в шаблон переменную . Если юзверь на странице впервые, то выведутся пустые строки. Иначе - его писанина

Но вот таких контроллеров у меня много (а ведь кроме ADD, есть ещё для каждого и EDIT), и приходится их копипастить, меняя значения, функцию обработки и файл шаблона. В идеале, конечно, нужно бы создать один уникальный. Но их не настолько много, чтобы захотелось этим заморачивать, но и не так мало, чтобы не задолбало копипастить $form_vars['title'] = $_POST['title'], учитывая, что в каждой форме около 10 полей.

Цитата
А если $POST пустой? Это как минимум некоректное отображение...

Учтено и в этом случае до этого не дойдёт

Спустя 5 минут, 42 секунды (4.04.2011 - 08:14) kirik написал(а):
Цитата (RAZZOR @ 4.04.2011 - 00:09)
Это сообщение отредактировал RAZZOR

О боги! Ты испортил форум! smile.gif

Спустя 12 минут, 15 секунд (4.04.2011 - 08:26) RAZZOR написал(а):
Цитата
О боги! Ты испортил форум!

Меня самого чуть кандрашка не хватила, когда я это увидел. Надо отписать куда-нибудь, чтоб пофиксили. Пришлось по быстрому писать скрипт echo nl2br(strip_tags($todo));. 5 минут и всё сново здорово-класс. Люблю я, блин, профессию программиста. Правда, бебешный тег php так и не заработал в итоге.

Спустя 6 минут, 40 секунд (4.04.2011 - 08:33) Trianon написал(а):
RAZZOR

Цитата
Так вот, если у меня 20 полей в форме, то придётся в контроллере писать

$vars = array('title' => $title, 'date' => $date, 'author' => $author)
// и т.д


Намного же проще сделать массив $form_vars, задать все переменные в него, а потом в шаблоне выводить <?php echo $form_vars['name']; ?>



замена неравноценная.

В первом случае, Вы как программист, контролируете, какие у Вас появятся переменные (элементы массива)
Во втором случае то же самое контролирует источник http-запроса.

Спустя 3 минуты, 39 секунд (4.04.2011 - 08:37) RAZZOR написал(а):
Цитата
В первом случае, Вы как программист, контролируете, какие у Вас появятся переменные (элементы массива)


По этому я и решил спросить насколько это хорошо. По сути ведь я буду использовать только нужные мне, обнулённые вначале скрипта. Может ли туда каким-нибудь макаром приписаться какая-нибудь гадость, и, что самое важное, натворить чего-нибудь страшного?

Спустя 1 час, 24 минуты, 35 секунд (4.04.2011 - 10:01) neadekvat написал(а):
Цитата (inpost @ 4.04.2011 - 04:47)
Отступ привыкли все ставить в 4 пробела, а не через табуляцию.

Не факт. Об этом уже давно и долго идут споры. Правда, если речь только об этом форуме - то пардон.

RAZZOR, я думаю, вам в любом случаи вручную придется обозначить ряд полей, которые обязательно должны придти, чтобы избежать того, о чем сказал Дмитрий.

Что-то вроде такого:
$isset_fields = array('Имя' => 'name', 'Возраст' => 'age', 'Пол' =>  'sex');

foreach ($isset_fields as $key => $value)
{
if ( ! empty($_POST[$value]))
$form_vars[$value] = $_POST[$value];
else
$errors[] = 'Некорректно заполнено поле '. $key;
}

Спустя 4 минуты, 53 секунды (4.04.2011 - 10:06) RAZZOR написал(а):
neadekvat, Во! Как я сам не додумался? Меня как раз смущало, что оно будет перебирать всё подряд, даже если туда передать миллион записей. А теперь только то, что нужно. Спасибо

Спустя 9 минут, 40 секунд (4.04.2011 - 10:16) Игорь_Vasinsky написал(а):
А по сути для каждого переданного запрос - должно быть своё правило (почти)

т.е. если это email - то првркана коректность
если URL - то своё правило

Единственное где цик бы я использовал - так это для XSS & SQL инъекции
Быстрый ответ:

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