2014-08-27 4 views
2

Я прочитал документацию, представленную оракула here, где говорится, что:Оказывает ли oci_bind_by_name безопасную инъекцию SQL?

Binding is important for Oracle database performance and also as a way to avoid SQL Injection security issues.

Насколько безопасно использовать oci_bind_by_name, чтобы избежать переменных? Есть ли более эффективные методы, чтобы избежать SQL Injection, или oci_bind_by_name хватает?

TIA!

ответ

3

Использование связанных параметров достаточно в обычных случаях и хорошая практика для избежания SQL-инъекции.

Но параметр в подготовленном операторе может использоваться только для значения в выражении SQL. Другими словами, где вы обычно пишете цитируемый строковый литерал, цитируемый литерал даты или числовой литерал. И один параметр == одно значение (без списков).

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

Однако существуют и другие (возможно, менее распространенные) случаи, для которых связанные параметры не работают. Если вам нужно написать запрос с именем динамической таблицы, именем столбца или другим идентификатором или целым выражением или ключевым словом SQL, тогда вам нужен другой метод. Эти случаи должны быть исправлены в синтаксисе SQL на этапе , подготовив, поэтому их нельзя параметризовать.

Например, вот запрос с динамическими частями, обозначенных использованием переменных, которые не могут быть параметрами:

$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc"; 

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

Никогда вход берут пользователя дословное и интерполировать его в SQL (или любой другой код, который обрабатывается во время выполнения, как аргумент вы кормите к eval() или shellexec()). И это не просто пользовательский ввод, который может быть небезопасным контентом.

См. Также мою презентацию SQL Injection Myths and Fallacies для более подробного объяснения.

+0

Отличный ответ и объяснение! Я сейчас пытаюсь избежать практики безопасного программирования, я просто гарантирую, что мои текущие методы безопасны для моих баз данных/серверов. Я ценю время @ bill! –

Смежные вопросы