Подтвердить что ты не робот

Обработка ввода с помощью Zend Framework (Post, get и т.д.)

im re-factoring php на zend-код, и весь код заполнен $_GET["this"] и $_POST["that"]. Я всегда использовал более phpish $this->_request->getPost('this') и $this->_request->getQuery('that') (это не так логично с getQuery вместо getGet).

Итак, мне было интересно, был ли мой метод более безопасным/лучше/проще использовать mantain. Я прочитал в документации по Zend Framework, что вы должны проверить свой собственный вход, поскольку объект запроса не сделает этого.

Это оставляет мне 2 вопроса:

  • Что лучше всего из двух? (или если еще один лучший способ)
  • Какова наилучшая практика для проверки ввода php с помощью этих методов?

Спасибо!

4b9b3361

Ответ 1

Обычно я использую $this → _ request- > getParams(); для получения параметров сообщения или URL. Затем я использую Zend_Filter_Input для проверки и фильтрации. Функция getParams() не выполняет проверку.

Используя Zend_Filter_Input, вы можете выполнить проверку уровня приложения, используя Zend Validators (или вы тоже можете написать свой собственный). Например, вы можете убедиться, что поле "месяцев" - это число:

$data = $this->_request->getParams();

$validators = array(
    'month'   => 'Digits',
);

$input = new Zend_Filter_Input($filters, $validators, $data);

Ответ 2

Расширение ответа Брайана.

Как вы отметили, вы также можете проверить $this->_request->getPost() и $this->_request->getQuery(). Если вы обобщили на getParams(), это похоже на использование суперклапана $_REQUEST, и я не считаю это приемлемым с точки зрения безопасности.

Дополнительно к Zend_Filter вы также можете использовать простой PHP, чтобы указать требуемый.

Например:

$id = (int) $this->_request->getQuery('id');

Для других значений он становится более сложным, поэтому убедитесь, что, например, цитата в ваших запросах БД (Zend_Db, см. идентификаторы цитирования, $db->quoteIdentifier()), а в представлениях используется $this->escape($var);, чтобы избежать содержимого.

Ответ 3

Вы не можете написать одноразовую функцию проверки для получения/публикации данных. Как и в некоторых случаях вам требуется, чтобы поле было целым числом, а в других - датой, например. Вот почему в структуре zend нет входной проверки.

Вам нужно будет написать код проверки в том месте, где оно вам нужно. Вы можете, конечно, написать некоторые вспомогательные методы, но вы не можете ожидать, что getPost() будет проверять что-то для вас самостоятельно...

И даже getPost/getQuery даже не проверяет что-либо, это задача - получить вам данные, которые вы не хотите, что с ним происходит, не стоит беспокоиться.

Ответ 4

$dataGet  = $this->getRequest()->getParam('id',null);
$valid = new Zend_Validate_Digits();

if( isset($dataGet) && $valid->isValid($dataGet) ){
 // do some...
} else{
  // not set
}

Ответ 5

Я всегда использовал более phpish $this->_request->getPost('this') и $this->_request->getQuery('that') (этот не слишком логичен с getQuery вместо getGet).

Что лучше всего из двух? (или если еще один лучший способ)

Просто краткое объяснение выбора getQuery(). Выбор формулировки исходит из того, что это за данные, а не от того, как он туда попал. GET и POST - это просто методы запроса, содержащие все виды информации, в том числе, в случае запроса POST, раздел, известный как "почтовые данные". Запрос GET не имеет такого блока, любые переменные данные, которые он несет, являются частью строки запроса url (часть после?).

Итак, в то время как getPost() получает данные из секции почтовых данных запроса POST, getQuery() извлекает данные из строки запроса либо запроса GET, либо POST (а также других методов HTTP-запроса).

(Обратите внимание, что GET Requests не должны использоваться для чего-либо, что может вызвать побочный эффект, например, изменение строки DB)

Итак, в ответ на ваш первый вопрос, используйте методы getPost() и getQuery(), таким образом, вы можете быть уверены в том, где источник данных (если вам все равно, getParams() также работает, но могут включать дополнительные данные).

Какова наилучшая практика для проверки ввода php с помощью этих методов?

Лучшим местом для проверки ввода является то, где вы его сначала используете. То есть, когда вы тянете его от getParams(), getPost() или getQuery(). Таким образом, ваши данные всегда верны для того, где вам это нужно, и если вы его отпустите, вы знаете, что это безопасно. Имейте в виду, что если вы передадите его другому контроллеру (или действию контроллера), вы должны, вероятно, проверить его там еще раз, чтобы быть в безопасности. Как вы это делаете, это зависит от вашего приложения, но его еще нужно проверить.

Ответ 6

не имеет прямого отношения к теме, но чтобы вы получили номер на своем входе, можно было бы использовать $var + 0 (однако, если $var является float, он остается плавающим) вы можете использовать в большинстве случаев $ id = $this → _ request- > getQuery ('id') +0;