2010-10-22 1 views
2

Мы изменили наши правила брандмауэра (Regex) к следующим:Будут ли эти шаблоны регулярных выражений улавливать все необходимые инъекции SQL?

Name 
Type 
Context 
Severity 
Pattern 

CS:select_into 
signature 
http-url 
critical 
.*\[select\]\s+.*\[into\].* 

CS:select_from 
signature 
http-url 
critical 
.*\[select\]\s+.*\[from\].* 

CS:insert_into 
signature 
http-url 
critical 
.*\[insert\]\s+.*\[into\].* 

CS:drop_database 
signature 
http-url 
critical 
.*\[drop\]\s+.*\[database\].* 

CS:drop_table 
signature 
http-url 
critical 
.*\[drop\]\s+.*\[table\].* 

CS:delete_from 
signature 
http-url 
critical 
.*\[delete\]\s+.*\[from\].* 

CS:drop_view 
signature 
http-url 
critical 
.*\[drop\]\s+.*\[view\].* 

CS:exec 
signature 
http-url 
critical 
.*\[exec\].*(%28|\().*(%29|\)).* 

CS:update_set 
signature 
http-url 
critical 
.*\[update\](%20|\+)(%20|\+|.)*\[set\].* 

Будет ли этот блок всех попыток инъекции SQL? Например, можно ли опустить представление, используя несколько пробелов?

+12

Нет, абсолютно нет! – Gumbo

+2

Предположительно, злоумышленник может просто выполнить POST SQL-инъекцию, а не добавлять ее в URL-адрес. –

+8

Вы защищаете форму базы данных SQL-инъекцией, используя правила регулярного выражения брандмауэра? Вам нравится жить на краю ... ;-) –

ответ

21

Черный список - неправильный подход. Всегда будут вещи, о которых вы не думали, о которых подумает злоумышленник.

Какой язык программирования/база данных вы используете? Все они имеют методы передачи параметров в операторы SQL. Например:

String userName = .... ; // from your GET or POST parameter 
String sql = "SELECT id FROM user where user_name=?"; 
ResultSet rs = executeSql(sql, userName); 

См http://en.wikipedia.org/wiki/SQL_injection#Parameterized_statements

+2

+1 если ты защищаешься, то ты не черный список – annakata

+0

+1 хорошо сказал, и избил меня до него – AdaTheDev

+1

Черный список - это просто аддон нашей безопасности. Мы реализовали больше способов предотвратить этот тип взлома. Один из наших слоев - это один, и мы заметили, что даже если у нас есть другие уровни безопасности, это останавливает некоторые опасные входы. – Younes

2

Попытка предотвратить SQL-инъекции, отфильтровывая определенные слова не будет работать - там всегда будет то, что вы пропустите и будет потреблять, чтобы попытаться найти все самое время покрывать.

Вы должны посмотреть на вещи, например, как вы запрашиваете базу данных - если вы строите SQL на лету и объединяете значения с клиентом непосредственно в оператор, то это будет важная область, на которую нужно сосредоточиться - переключиться на используя параметризованные SQL/хранимые процедуры. Хранимые процедуры также предоставят вам дополнительный уровень безопасности, поскольку вы можете предоставить разрешения для их выполнения, не предоставляя прямых прав на базовые таблицы.

0

Нельзя использовать регулярное выражение для фильтрации входных данных.

Вы должны отфильтровать свой ввод один за другим, прежде чем передавать их на сервер sql.

Если вы вставляете строку (или что-либо, что находится между апострофами в инструкции sql), вы должны использовать функцию escape-функции вашего SQL-сервера, которая предотвратит любые атаки там.

Если ваши данные представляют собой некоторый тип номера (целое число или поплавок), тогда вы должны проверить, действительно ли данные являются числом (вы не можете делать SQL-инъекцию без букв). Лучший способ сделать это зависит от языка программирования, который вы используете, но в основном проверки типа или принудительные типы.

Вы не должны вставлять какие-либо ненадежные (что-либо от пользователя ненадежные) строковые данные в sql statemen, где вы не можете размещать вокруг него апострофы, например, для таблицы или имени столбца.

0

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

+2

Ну, на самом деле это невозможно в реальных приложениях. Например, вы можете захотеть, чтобы ваше приложение могло обновлять баланс пользователя.Вероятно, вы не хотите, чтобы его обманули, чтобы обновить этот баланс до $ 1M. Привилегия не даст вам этого. – Gaius

+0

Обновления должны быть более контролируемыми и, если это возможно, выполняться под учетной записью с отдельной аутентификацией. Не должно быть возможности для учетной записи, подверженной возможности динамического sql, имеющего разрешения для выполнения команд, которые OP пытается заблокировать с помощью RegEx. Не должно быть никаких привилегий, превышающих минимальные требования приложения. – MartW

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