Как предложение и инъекция sql - PullRequest
10 голосов
/ 26 января 2011

У меня есть сомнения по поводу этой ситуации.

У меня есть такой запрос в хранимой процедуре:

SELECT column1, column2
FROM table1
WHERE column1 like '%' + @column1 + '%'

Мой вопрос, это уязвимо для SQL-инъекций?Мне нужно изменить это на что-то вроде этого: (?)

declare @column1Like nvarchar(200);

@column1Like = '%' + @column1 + '%'

SELECT column1, column2
FROM table1
WHERE column1 like @column1Like

С уважением

Ответы [ 6 ]

10 голосов
/ 26 января 2011

Быстрый ответ - нет. Чтобы быть уязвимым для внедрения SQL-кода, необходимо использовать динамическое выполнение SQL.

Этот будет уязвимым:

EXECUTE ('SELECT column1, column2 FROM table1 WHERE column1 like ' + @column1Like);

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

3 голосов
/ 26 января 2011

Like ничем не отличается от = или любого другого предиката.

Однако пользователь может добавить дополнительные шаблоны (%, _) в шаблон; если это имеет значение.

2 голосов
/ 26 января 2011
SELECT column1, column2
FROM table1
WHERE column1 like '%' + @column1 + '%'

Поскольку этот запрос работает только с переменными, ему некуда поместить код вместо данных и, следовательно, он не уязвим для SQL внедрения.

Я, конечно, предполагаю, что @column1здесь есть переменная SQL Server, и вы используете параметризованный запрос в своем клиентском языке для привязки к нему значения.

1 голос
/ 26 января 2011

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

1 голос
/ 26 января 2011

Он не уязвим, поскольку он уже является строковым значением в пространстве SQL. Хотя, это может нарушить запрос.

0 голосов
/ 23 мая 2012

Я думаю, что это уязвимо, например: '%' или 1 = 1 - покажет все регистры базы данных, если вы не отформатируете ее как @column1Like.

В этом случае я думаю, что это то же самое, что (@column1Like= '' или @column1Like is null) но вы должны подумать другие примеры, такие как

'%' union select SELECT `column11`, `column22`
FROM table2 where `colum11` -- is the same type than `column1` 
--and `column22` is the same type than `column22`.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...