Ограничить точку с запятой, чтобы предотвратить внедрение SQL? - PullRequest
8 голосов
/ 23 июля 2011

Я видел, что строки SQL-инъекций часто создаются следующим образом:

' ; DROP DATABASE db  --

Поэтому, если я запрещаю использование точек с запятой во входных данных моего приложения, предотвращает ли это 100% любую атаку SQL-инъекцией?

Ответы [ 6 ]

9 голосов
/ 23 июля 2011

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

Я предлагаю использовать встроенные библиотечные функции вместо того, чтобы пытаться написать собственный код для предотвращения инъекций.

Наивная реализация удаляет ;, даже если она должна использоваться (скажем, как часть переданного параметра VARCHAR или CHAR, где это допустимо). В конечном итоге вам придется написать собственный синтаксический анализатор SQL, чтобы принимать / отклонять запросы.

Вы можете прочитать здесь подробнее о динамическом SQL и проблемах, которые он представляет (и решает).

8 голосов
/ 23 июля 2011

Нет, это не предотвращает SQL инъекций. Каждый раз, когда вы динамически создаете SQL либо на стороне клиента, либо с помощью EXEC внутри хранимого процесса, вы рискуете.

Параметризованные запросы являются предпочтительным способом получения ввода в запрос.

4 голосов
/ 23 июля 2011

Нет, это не так.Вы только что показали один пример SQL-инъекции.Но есть гораздо больше, все в зависимости от контекста, в который вы вставляете данные.

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

3 голосов
/ 23 июля 2011

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

2 голосов
/ 23 июля 2011

Нет, не фокусируйтесь на точках с запятой.Сосредоточьтесь на том, как вы вводите пользовательский ввод в запросе sql - обычно в кавычках - а затем сосредоточьтесь на кавычках.Также не забывайте, что при работе с regexp в sql им нужна немного другая процедура экранирования.

1 голос
/ 23 июля 2011

это будет зависеть от множества вещей (какие запросы и т. Д.). Вы должны использовать подготовленные заявления для этого

...