Вы все еще можете получать инъекции SQL из хранимых процедур, которые внутренне используют синтаксис PREPARE (в MySQL) для создания динамических операторов SQL.
Это нужно делать с особой осторожностью, используя QUOTE () по мере необходимости.
В идеале нам не нужно использовать PREPARE в хранимых подпрограммах, но в некоторых случаях этого становится очень трудно избежать:
- До MySQL 5.5 предложение LIMIT не могло использоватьнепостоянные значения.
- Списки, используемые в предложении IN (), не могут быть (разумно) параметризованы, поэтому вам необходимо использовать динамический SQL, если этот шаблон используется
- Иногда желательно использоватьдинамически генерируемые предложения ORDER BY.
и т. д.
В случае, когда необходимо использовать PREPARE, я бы порекомендовал в порядке предпочтения:
- Если что-то имеет тип INT (и т. Д.), Оно не подвержено внедрению SQL, и вы можете поместить значение в запрос без проблем (например, для LIMIT)
- Строковые значения cбыть помещенным в @variable перед EXECUTE или переданным в предложение EXECUTE
- Необходимо проверить список значений (например, для IN ()).
- Наконец,QUOTE () может использоваться для цитирования строковых значений, что может быть полезно в некоторых случаях