В настоящее время я использую Zend_Db для управления моими запросами. Я уже написал код, который обрабатывает запросы, подобные приведенным ниже:
$handle->select()->from('user_id') ->where('first_name=?', $id) ->where('last_name=?', $lname)
Я сделал это без дезинфекции ввода, предполагая, что Zend_Db будет. Это делает Zend?
Другой вопрос: дезинформирует ли Zend_Db insert('table', $data)
и update
запросы?
Благодарю.
Я написал много кода для параметров базы данных и цитирования в Zend Framework, когда я был руководителем команды для проекта (до версии 1.0).
Я старался поощрять лучшие практики там, где это было возможно, но мне приходилось просто балансировать с легкостью использования.
Обратите внимание, что вы всегда можете проверить строковое значение объекта Zend_Db_Select
, чтобы узнать, как он решил делать кавычки.
print $select; // invokes __toString() method
Также вы можете использовать Zend_Db_Profiler
для проверки SQL, который выполняется от вашего имени Zend_Db
.
$db->getProfiler()->setEnabled(true); $db->update( ... ); print $db->getProfiler()->getLastQueryProfile()->getQuery(); print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams(); $db->getProfiler()->setEnabled(false);
Вот несколько ответов на ваши конкретные вопросы:
Zend_Db_Select::where('last_name=?', $lname)
Значения указаны соответствующим образом. Хотя « ?
» Выглядит как заполнитель параметров, в этом методе аргумент фактически цитируется соответствующим образом и интерполируется. Таким образом, это не истинный параметр запроса. Фактически, следующие два оператора производят точно такой же запрос, как и указанное выше:
$select->where( $db->quoteInto('last_name=?', $lname) ); $select->where( 'last_name=' . $db->quote($lname) );
Однако, если вы передаете параметр, являющийся объектом типа Zend_Db_Expr
, тогда он не цитируется. Вы отвечаете за риски SQL-инъекций, потому что они интерполированы дословно, для поддержки значений выражения:
$select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
Любая другая часть этого выражения, которое должно быть процитировано или ограничено, является вашей ответственностью. Например, если вы интерполируете любые переменные PHP в выражение, ваша ответственность за безопасность. Если у вас есть имена столбцов, которые являются ключевыми словами SQL, вы должны разграничить их с помощью quoteIdentifier()
. Пример:
$select->where($db->quoteIdentifier('order').'=?', $myVariable)
Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )
Имена таблиц и столбцов ограничены, если вы не отключите AUTO_QUOTE_IDENTIFIERS
.
Значения параметризуются как истинные параметры запроса (не интерполируются). Если значение не является объектом Zend_Db_Expr
, в этом случае он интерполируется дословно, поэтому вы можете вставлять выражения или NULL
или что-то еще.
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )
Имена таблиц и столбцов ограничены, если вы не отключите AUTO_QUOTE_IDENTIFIERS
.
Значения параметризуются, если только они не являются объектами Zend_Db_Expr
, как в методе insert()
.
Аргумент $where
не фильтруется вообще, поэтому вы несете ответственность за любые риски SQL-инъекций в этом. Вы можете использовать метод quoteInto()
чтобы сделать предложение более удобным.
Да. См. http://framework.zend.com/manual/en/zend.db.select.html . Не волнуйся. Вы правы, чтобы быть скептичными.
по умолчанию, когда вы используете привязку значений в своих SQL-запросах следующим образом:
where('first_name=?', $id);
Zend_Db использует соответствующее цитирование значений для предотвращения SQL-инъекции. хотя настоятельно рекомендуется (по книгам, статьям, учебным пособиям и самому опыту) для дезинфекции / фильтрации ввода пользователя. Zend_Filter может быть очень полезен.
Бит, который должен заставить вас чувствовать себя в безопасности, это? отмечает в предложениях where. Это параметры, которые безопасно заменяются вторым аргументом системой базы данных.
Когда вам это нужно где-то в другом месте (например, в соединении), или вы не уверены, что это будет экранировано, вы всегда можете использовать $this->getAdapter()->quoteInto('type = ?',1);
Вход для фильтрации всегда хорош, потому что, скорее всего, он будет куда-то иным, чем просто БД, и вы, по крайней мере, хотите получить разумные данные в своей базе данных на каком-то уровне.
Zend_Filter_Input
по пути в Одна вещь об этом, когда значение равно NULL, вы можете добиться недействительного запроса
$value = NULL; $select->where('prop=?', $value);
Результат: ошибка SQL