Параметризованные SQL-операторы по сравнению с очень простым методом

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

Так, например, существует searchfield, в котором можно ввести customername для поиска в customertable. Если Вы вошли бы

Парикмахерская Peter

Оператор SELECT был бы похож

SELECT *
FROM Customers
WHERE Customername = 'Peter''s Barbershop'

Если теперь взломщик вставил бы это:

';DROP TABLE FOO; --

Оператор был бы похож:

SELECT *
FROM Customers
WHERE Customername = ''';DROP TABLE FOO;--'

Это не отбросило бы таблицы, но искало бы customertable customername'; НЕЧТО DROP TABLE; - который, я предполагаю, не будет найден ;-)

Теперь через некоторое время записи операторов и защиты меня против Внедрения SQL с этим методом, я считал, что многие разработчики используют параметризованные операторы, но я никогда не читал статью, где "наш" метод использовался. Так определенно существует серьезное основание для него.

То, какие сценарии параметризовали операторы, покроет, но наш метод не делает? Каковы преимущества параметризованных операторов по сравнению с нашим методом?

Спасибо
Philipp

7
задан Philipp Grathwohl 28 April 2010 в 15:31
поделиться

5 ответов

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

  1. Решает проблему с форматированием и анализом даты и времени.
  2. Вы можете подготовить план выполнения для параметризованного запроса.
  3. Защита от sql-инъекций.

Не припомню еще одного профи :).

Однако способ "удваивать каждые кавычки" имеет проблему с полями с ограниченной длиной символа.

Например:

  • На странице есть поле для «псевдонима», длина которого может составлять 10 символов.
  • Пользователь вставляет «Неважно» - точные 10 символов.

Теперь, если вы удвоите кавычки, значение будет состоять из 11 символов, и база данных «вырежет» его, и вы получите другое значение в db, чем введено пользователем.

Поэтому рекомендую параметры.

4
ответ дан 7 December 2019 в 05:19
поделиться

Краткий ответ:
Вам следует использовать параметризованные запросы просто потому, что сервер базы данных лучше вас знает, какие символы нужно экранировать .

Длинный ответ:
' не обязательно единственный специальный символ, который нужно экранировать. Эти специальные символы отличаются от сервера БД к серверу БД. MySQL, например, также использует \ в качестве escape-символа (если не установлено sql_mode = NO_BACKSLASH_ESCAPES ). Следовательно, '' и \ ' означают одно и то же.

Это не относится, скажем, к Oracle.

1
ответ дан 7 December 2019 в 05:19
поделиться

Один большой недостаток состоит в том, что ваше решение полагается на разработчика, который не забыл добавить символ, очевидно, компилятор не будет жаловаться. Это опасно.

Во-вторых, производительность должна быть улучшена с помощью параметризованных операторов SQL, как указывает Джефф здесь 2005 !!!).

2
ответ дан 7 December 2019 в 05:19
поделиться

Одно из преимуществ состоит в том, что водитель сам определяет, что ему нужно убежать, а что нет. Ваш метод может быть нарушен вводом вроде этого:

  \'; DROP TABLE foo;--

Что приведет к

  SELECT *
  FROM Customers
  WHERE Customername = '\'';DROP TABLE FOO;--'

Первая кавычка экранируется, вторая - нет и закрывает строку.

1
ответ дан 7 December 2019 в 05:19
поделиться

Каковы преимущества параметризованных утверждений по сравнению с нашим методом?

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

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

0
ответ дан 7 December 2019 в 05:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: