Я ре-факторинг php на код zend, и весь код полон $_GET["this"] и $_POST["that"]. Я всегда использовал более phpish $this->_request->getPost('this') и $this->_request->getQuery('that') (это было не так логично с getquery вместо getGet).
Поэтому мне было интересно, был ли мой метод безопаснее / лучше / проще в использовании. Я прочитал в документации Zend Framework, что вы должны проверить свой собственный ввод, поскольку объект запроса этого не сделает.
Это оставляет мне 2 вопроса:
Спасибо!






Обычно я использую $ 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);
Вы не можете написать универсальную функцию проверки для данных получения / публикации. Поскольку в некоторых случаях вам требуется, чтобы поле было целым числом, а в других, например, датой. Вот почему в фреймворке zend нет проверки ввода.
Вам нужно будет написать код проверки в том месте, где он вам нужен. Вы, конечно, можете написать несколько вспомогательных методов, но вы не можете ожидать, что getPost () сам по себе что-то проверяет для вас ...
И это даже не место getPost / getQuery для проверки чего-либо, его задача - доставить вам данные, которых вы не хотите, и то, что с ними происходит оттуда, не должно вызывать беспокойства.
Расширение ответа Брайана.
Как вы отметили, вы также можете проверить $this->_request->getPost() и $this->_request->getQuery(). Если обобщить getParams(), это похоже на использование суперглобального $_REQUEST, и я не думаю, что это приемлемо с точки зрения безопасности.
В дополнение к Zend_Filter вы также можете использовать простой PHP для приведения требуемых файлов.
Например.:
$id = (int) $this->_request->getQuery('id');
Для других значений все становится сложнее, поэтому обязательно, например, цитировать в ваших запросах к БД (Zend_Db, см. идентификаторы цитирования, $db->quoteIdentifier()), а в представлениях использовать $this->escape($var); для экранирования содержимого.
I have always used the more phpish
$this->_request->getPost('this')and$this->_request->getQuery('that')(this one being not so much logical with the getquery insteado of getGet).What is best of this two? (or if theres another better way)
Просто краткое пояснение по выбору getQuery(). Выбор формулировки зависит от того, какие это данные, а не от того, как они туда попали. GET и POST - это просто методы запроса, содержащие всевозможную информацию, включая, в случае запроса POST, раздел, известный как «данные публикации». Запрос GET не имеет такого блока, любые переменные данные, которые он несет, являются частью строки запроса URL-адреса (часть после?).
Итак, в то время как getPost() получает данные из раздела данных POST запроса POST, getQuery() извлекает данные из строки запроса запроса GET или POST (а также других методов HTTP-запроса).
(Обратите внимание, что запросы GET не следует использовать для чего-либо, что может вызвать побочный эффект, например, изменение строки БД)
Итак, отвечая на ваш первый вопрос, используйте методы getPost() и getQuery(), таким образом, вы можете быть уверены в том, где находится источник данных (если вам все равно, getParams() также работает, но может включать дополнительные данные).
What is the best practice for validating php input with this methods?
Лучшее место для проверки ввода - это то место, где вы его используете первый. То есть, когда вы вытаскиваете его из getParams(), getPost() или getQuery(). Таким образом, ваши данные всегда верны там, где они вам нужны, и если вы передадите их, вы знаете, что это безопасно. Имейте в виду, что если вы передадите его другому контроллеру (или действию контроллера), вам, вероятно, следует снова проверить его там, на всякий случай. Как вы это сделаете, зависит от вашего приложения, но его еще нужно проверить.
не имеет прямого отношения к теме, но чтобы гарантировать, что вы получите число во вводе, можно также использовать $ var + 0 (однако, если $ var является плавающим, он остается плавающим) вы можете использовать в большинстве случаев $ id = $ this -> _ request-> getQuery ('id') +0;
$dataGet = $this->getRequest()->getParam('id',null);
$valid = new Zend_Validate_Digits();
if ( isset($dataGet) && $valid->isValid($dataGet) ){
// do some...
} else{
// not set
}
Я согласен и также предлагаю взглянуть на Zend Form, поскольку вы можете прикреплять фильтры и валидаторы к форме, а затем проверять весь входящий ввод с помощью этого объекта формы. Не обращайте внимания на то, что это объект формы - это также контейнер фильтра / валидатора.