im re-factoring php на zend-код, и весь код заполнен $_GET["this"]
и $_POST["that"]
. Я всегда использовал более phpish $this->_request->getPost('this')
и $this->_request->getQuery('that')
(этот не слишком логичен с getQuery вместо getGet).
Поэтому мне было интересно, был ли мой метод более безопасным / лучше / проще обслуживать. Я прочитал в документации по Zend Framework, что вы должны проверить свой собственный вход, поскольку объект запроса не сделает этого.
Это оставляет мне два вопроса:
Благодаря!
Обычно я использую $ this -> _ request-> getParams (); для получения параметров сообщения или URL. Затем я использую Zend_Filter_Input для проверки и фильтрации. Функция getParams () не выполняет проверку.
Используя Zend_Filter_Input, вы можете выполнить проверку уровня приложения, используя Zend Validators (или вы также можете написать свой собственный). Например, вы можете убедиться, что поле «months» – это число:
$data = $this->_request->getParams(); $validators = array( 'month' => 'Digits', ); $input = new Zend_Filter_Input($filters, $validators, $data);
Расширение ответа Брайана.
Как вы отметили, вы также можете проверить $this->_request->getPost()
и $this->_request->getQuery()
. Если вы getParams()
, это похоже на использование $_REQUEST
_REQUEST, и я не думаю, что это приемлемо с точки зрения безопасности.
Дополнительно к Zend_Filter вы также можете использовать простой PHP для включения необходимого.
Например:
$id = (int) $this->_request->getQuery('id');
Для других значений это становится более сложным, поэтому обязательно $db->quoteIdentifier()
в своих запросах БД ( Zend_Db , см. Идентификаторы цитирования, $db->quoteIdentifier()
), а в представлениях используется $this->escape($var);
чтобы избежать содержимого.
Вы не можете написать одноразовую функцию проверки для получения / отправки данных. Как и в некоторых случаях вам требуется, чтобы поле было целым числом, а в других – датой, например. Вот почему в структуре zend нет входной проверки.
Вам нужно будет написать код проверки в том месте, где оно вам нужно. Конечно, вы можете написать некоторые вспомогательные методы, но вы не можете ожидать, что getPost () будет проверять что-то для вас самостоятельно …
И даже не иметь место getPost / getQuery для проверки чего-либо, это задача – получить данные, которые вы не хотите, что с ним происходит, не должно быть проблемой.
$dataGet = $this->getRequest()->getParam('id',null); $valid = new Zend_Validate_Digits(); if( isset($dataGet) && $valid->isValid($dataGet) ){ // do some... } else{ // not set }
Я всегда использовал более 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()
. Таким образом, ваши данные всегда верны для того, где вам это нужно, и если вы его отпустите, вы знаете, что это безопасно. Имейте в виду, что если вы передадите его другому контроллеру (или действию контроллера), вы должны, вероятно, проверить его там еще раз, чтобы быть в безопасности. Как вы это делаете, это зависит от вашего приложения, но его все еще нужно проверить.
не связанный напрямую с темой, но чтобы гарантировать, что вы получите число на своем входе, можно также использовать $ var + 0 (однако, если $ var является float, он остается float), вы можете использовать в большинстве случаев $ id = $ this -> _ request-> getQuery ('id') +0 ;