Есть ли способ ввести SQL, даже если символ 'удален? - PullRequest
12 голосов
/ 16 сентября 2008

Если из запроса SQL я удаляю все символы ', есть ли другой способ выполнить атаку SQL-инъекцией на базу данных?

Как это можно сделать? Кто-нибудь может привести примеры?

Ответы [ 14 ]

0 голосов
/ 16 сентября 2008

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

Если вы когда-либо получали id = "hello", когда ожидали id = 1044, всегда лучше вернуть пользователю полезную ошибку, а не позволять базе данных возвращать ошибку.

0 голосов
/ 16 сентября 2008

Я могу только повторить то, что сказали другие. Параметризованный SQL - это путь. Конечно, это немного болезненно, когда вы кодируете его, но как только вы сделаете это один раз, вам не составит труда вырезать и вставлять этот код и вносить необходимые изменения. У нас есть много приложений .Net, которые позволяют посетителям веб-сайтов указывать целый ряд критериев поиска, и код создает оператор SQL Select на лету, но все, что могло быть введено пользователем, входит в параметр.

0 голосов
/ 16 сентября 2008

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

\;.*--\

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

Поэтому ответ таков: нет, простое удаление апострофов не гарантирует вашей безопасности от SQL-инъекций.

0 голосов
/ 16 сентября 2008

Это зависит от того, как вы составите запрос, но по сути да.

Например, в Java, если вы должны были сделать это (намеренно вопиющий пример):

 String query = "SELECT name_ from Customer WHERE ID = " + request.getParameter("id");

тогда есть большая вероятность, что вы открываете себя для инъекционной атаки.

В Java есть несколько полезных инструментов для защиты от них, таких как PreparedStatements (где вы передаете строку типа «SELECT name_ from Customer WHERE ID =?», А слой JDBC обрабатывает экранирование, заменяя для вас токены?) некоторые другие языки не очень полезны для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...