Обработка ввода с помощью 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 с помощью этих методов?
Спасибо!
Ответы
Ответ 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;