предотвращение инжекций MySQL с классом Zend_Db

Из трех вариантов, единственный, который вы должны избегать, это # ​​1. Не используйте магические куки в вашем коде. Поместив константы либо в пространство имен, либо в класс, вы упростите расширение и поддержку своего кода в будущем.

Если ваши константы имеют глобальный характер, то между 2 и 3 это мало что значит. Важно то, что вы выбираете один и придерживаетесь его. Но если у вас есть константы, которые применяются к определенному классу, то они должны быть частью этого класса.

Лично я бы использовал пространство имен для большинства вещей.

14
задан daniel 10 June 2009 в 11:23
поделиться

7 ответов

Я написал много кода для параметров базы данных и цитирования в 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-> где ('last_name ='. $ db-> quote ($ lname));
    

    Однако, если вы передаете параметр, являющийся объектом типа Zend_Db_Expr , то он не заключен в кавычки. Вы несете ответственность за риски внедрения SQL, поскольку он дословно интерполируется для поддержки значений выражений:

     $ select-> where ('last_modified 

    Любая другая часть этого выражения, которая должна быть цитирована или ограничена, является вашей ответственностью. Например, если вы вставляете какие-либо переменные 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 () , чтобы сделать цитирование более удобным.

24
ответ дан 1 December 2019 в 08:17
поделиться

по умолчанию, когда вы используете привязку значений в ваших SQL-запросах, например:

where('first_name=?', $id);

Zend_Db использует соответствующие кавычки для значений, чтобы предотвратить SQL-инъекцию. хотя настоятельно рекомендуется (из книг, статей, руководств и собственного опыта) очищать / фильтровать вводимые пользователем данные. Zend_Filter может быть очень полезным.

2
ответ дан 1 December 2019 в 08:17
поделиться

Да. См. http://framework.zend.com/manual/en/zend.db.select.html . Не волнуйся. Вы правы, когда относитесь к этому скептически.

5
ответ дан 1 December 2019 в 08:17
поделиться

Если он вам нужен где-то еще (например, в соединении) или вы не уверены, будет ли он экранирован, вы всегда можете использовать $ this-> getAdapter () -> quoteInto (' type =? ', 1);

1
ответ дан 1 December 2019 в 08:17
поделиться

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

  • Zend_Filter_Input в пути в
  • Подготовленные операторы (или quoteInto, если не в подготовленном)
  • Фильтры выхода на выходе (htmlentities и т. д.).
0
ответ дан 1 December 2019 в 08:17
поделиться

Одна вещь об этом: когда значение равно NULL, вы можете получить недействительный запрос

$value = NULL;
$select->where('prop=?', $value);

Результат: ошибка SQL

0
ответ дан 1 December 2019 в 08:17
поделиться

Бит, который должен заставить вас чувствовать себя в безопасности, - это? отметки в предложениях where. Это параметры, которые система базы данных безопасно заменяет вторым аргументом.

1
ответ дан 1 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: