2014-02-06 2 views
-1

Допустим, у нас есть такое SQL предложение (работает MySQL 5.6):Может ли правильное форматирование SQL-предложений смягчать SQL-инъекцию?

SELECT * FROM order WHERE orderid = 12345 LIMIT 0, 1 

Представим, что OrderID поставляется пользователем (взято из запроса URL). У нас есть «LIMIT 0, 1» часть, которая нормально будет возвращать только 1 строку результатов, но злоумышленник может сделать OrderID быть что-то вроде «12345 OR 1 = 1»

SELECT * FROM order WHERE orderid = 12345 OR 1=1 LIMIT 0, 1 

Теперь это снова возвращает только один ряд , Теперь злоумышленник добавляет встроенный комментарий к переменной OrderId «12345 OR 1 = 1 -»

SELECT * FROM order WHERE orderid = 12345 OR 1=1 -- LIMIT 0, 1 

На этот раз злоумышленник получает запись каждый заказа, потому что он закомментирован на «LIMIT 0, 1» часть.

Однако, если надлежащее форматирование будет использоваться следующим образом:

SELECT * 
FROM order 
WHERE orderid = 12345 
LIMIT 0, 1 

Встроенные комментарии (-) бы не закомментировать «LIMIT 0, 1», как на новой линии.

Может ли злоумышленник каким-то образом удалить «LIMIT 0, 1" часть даже при форматировании, как выше?

+1

Ничего себе, никогда не думали о инъекционные '--'. – Taosique

+2

Параметры запроса намного проще, а также предоставляют другие преимущества. –

+1

короткий ответ, нет. готовить и дезинфицировать, думать кулинария – Marriott81

ответ

1

Нет, это не остановит его, инжектор мог просто написать:

12345 OR 1 = 1; SELECT * FROM `order`; 

Создание полного SQL:

SELECT * 
FROM `order` 
WHERE orderid = 12345 OR 1 = 1; SELECT * FROM `order` 
LIMIT 0, 1; 

Что еще будет возвращать все заказы в первом наборе результатов, а here.

Не пытайтесь изобретать колесо, запрограммированные запросы и подготовленные заявления существуют по какой-либо причине!

Один из лучших сайтов на это Bobby-tables.com

2

Изменение запроса быть многострочный (на любой другой вид форматирования) не является„реальной“безопасности меру

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

Я рекомендую быстрый поиск Google для защиты от SQL-инъекций для получения более подробной информации.

1

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

OR orderid = 1 ORDER BY orderid 

Я подготовил пример на sqlfiddle. Btw. ваш примерный код неверен. Вы использовали зарезервированное слово (заказ) в качестве имени таблицы. Мне пришлось изменить ваш код относительно этого.

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

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