Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как защититься от «SQL injection»?  [new]
Виталий Е.С.
Member

Откуда: Университет
Сообщений: 105
Добрый день!
Скажите, пожалуйста, как защититься от «SQL injection» в запросе если с клиента берется строка для условий LIKE?

print @@version
Microsoft SQL Server 2005 - 9.00.5000.00

Пример таблицы и запроса:
CREATE TABLE [dbo].[books](
	[id] [int] NOT NULL,
	[name] [nvarchar](50) NOT NULL,
	[desc] [nvarchar](max) NULL
)
GO
INSERT INTO [TestDB1].[dbo].[books]([id],[name],[desc]) VALUES (1,N'first' ,N'first book' )
INSERT INTO [TestDB1].[dbo].[books]([id],[name],[desc]) VALUES (2,N'second',N'second book')
INSERT INTO [TestDB1].[dbo].[books]([id],[name],[desc]) VALUES (3,N'third' ,N'third book' )
GO
SELECT * FROM [dbo].[books]
where [desc] like '%second%' or [desc] like '% SQL injection %'

Строка пришедшая с клиента всегда обрамляется символами % и '
В данном случае злоумышленник может закрыть строку - например
%' GO Delete From books GO 
И тогда запрос примет вид:
SELECT * FROM [dbo].[books]
where [desc] like '%second%' or [desc] like '% %' GO Delete From books GO  %'
Достаточно ли будет для защиты в строке пришедшей с клиента заменить ' (одна кавычка) на '' (две одинарных кавычки)?
9 авг 11, 15:19    [11092114]     Ответить | Цитировать Сообщить модератору
 Re: Как защититься от «SQL injection»?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
https://www.sql.ru/forum/actualtopics.aspx?search=injection&submit=%CD%E0%E9%F2%E8&bid=1
9 авг 11, 15:26    [11092167]     Ответить | Цитировать Сообщить модератору
 Re: Как защититься от «SQL injection»?  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
Может быть не давать пользователям права на таблицы, а доступ к данным предоставлять через хранимые процедуры?
9 авг 11, 15:27    [11092174]     Ответить | Цитировать Сообщить модератору
 Re: Как защититься от «SQL injection»?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
При наличии прав на таблицы injection мутить не обязательно - подключился напрямую к серверу и сделал свои грязные дела.
9 авг 11, 15:30    [11092206]     Ответить | Цитировать Сообщить модератору
 Re: Как защититься от «SQL injection»?  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Виталий Е.С.
В данном случае злоумышленник может закрыть строку - например
%' GO Delete From books GO 
И тогда запрос примет вид:
SELECT * FROM [dbo].[books]
where [desc] like '%second%' or [desc] like '% %' GO Delete From books GO  %'
Какой-то злоумышленник-неудачник!
Кто будет обрабатывать слова 'GO', спрашивается?
9 авг 11, 15:46    [11092335]     Ответить | Цитировать Сообщить модератору
 Re: Как защититься от «SQL injection»?  [new]
aleks2
Guest
Виталий Е.С.
Добрый день!
Скажите, пожалуйста, как защититься от «SQL injection» в запросе если с клиента берется строка для условий LIKE?

Пример таблицы и запроса:
SELECT * FROM [dbo].[books]
where [desc] like '%second%' or [desc] like '% SQL injection %'

Строка пришедшая с клиента всегда обрамляется символами % и '
В данном случае злоумышленник может закрыть строку - например
%' GO Delete From books GO 
И тогда запрос примет вид:
SELECT * FROM [dbo].[books]
where [desc] like '%second%' or [desc] like '% %' GO Delete From books GO  %'
Достаточно ли будет для защиты в строке пришедшей с клиента заменить ' (одна кавычка) на '' (две одинарных кавычки)?


А нахера в данном конкретном случае динамика?
Чем
SELECT * FROM [dbo].[books]
where [desc] like @FirstPattern or [desc] like @SecondPattern
не канает?
9 авг 11, 16:28    [11092732]     Ответить | Цитировать Сообщить модератору
 Re: Как защититься от «SQL injection»?  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Виталий Е.С.,

пользуйтесь параметрами, что-ли, в запросах. Или как уже посоветовали через процедурами.
9 авг 11, 16:47    [11092896]     Ответить | Цитировать Сообщить модератору
 Re: Как защититься от «SQL injection»?  [new]
Виталий Е.С.
Member

Откуда: Университет
Сообщений: 105
aleks2
А нахера в данном конкретном случае динамика?


Т.к. поиск должен искать по всем словам или хотябы по одному.
Поэтому я разбиваю фразу на массив слов. И каждое слово вставляю в условия LIKE.

	books.ShortDesc LIKE N'%мама%' Or 
	books.ShortDesc LIKE N'%дома%' Or 
	books.ShortDesc LIKE N'%мыла%' Or 
	books.ShortDesc LIKE N'%раму%' 

Поэтому легче использовать динамику.
11 авг 11, 17:56    [11105784]     Ответить | Цитировать Сообщить модератору
 Re: Как защититься от «SQL injection»?  [new]
Glory
Member

Откуда:
Сообщений: 104751
Виталий Е.С.
Поэтому я разбиваю фразу на массив слов. И каждое слово вставляю в условия LIKE.

	books.ShortDesc LIKE N'%мама%' Or 
	books.ShortDesc LIKE N'%дома%' Or 
	books.ShortDesc LIKE N'%мыла%' Or 
	books.ShortDesc LIKE N'%раму%' 

Поэтому легче использовать динамику.


books.ShortDesc LIKE поле_таблицы_куда_был_разобран_массив_слов_позволит_избежать_динамики
11 авг 11, 17:59    [11105818]     Ответить | Цитировать Сообщить модератору
 Re: Как защититься от «SQL injection»?  [new]
Виталий Е.С.
Member

Откуда: Университет
Сообщений: 105
Достаточно ли просто удваивать кавычки?
11 авг 11, 17:59    [11105819]     Ответить | Цитировать Сообщить модератору
 Re: Как защититься от «SQL injection»?  [new]
SQL injection
Guest
Виталий Е.С.
aleks2
А нахера в данном конкретном случае динамика?


Т.к. поиск должен искать по всем словам или хотябы по одному.
Поэтому я разбиваю фразу на массив слов. И каждое слово вставляю в условия LIKE.

	books.ShortDesc LIKE N'%мама%' Or 
	books.ShortDesc LIKE N'%дома%' Or 
	books.ShortDesc LIKE N'%мыла%' Or 
	books.ShortDesc LIKE N'%раму%' 

Поэтому легче использовать динамику.



я не знаю как пользователь вам передает несколько масок, но кто мешает их вставить в таблицу и делать

exists (
select * from mask m where books.ShortDesc LIKE '%' + m.maks + '%'
)
11 авг 11, 18:03    [11105853]     Ответить | Цитировать Сообщить модератору
 Re: Как защититься от «SQL injection»?  [new]
Виталий Е.С.
Member

Откуда: Университет
Сообщений: 105
SQL injection
я не знаю как пользователь вам передает несколько масок, но кто мешает их вставить в таблицу и делать


Пользователь присылает строку.
мама дома мыла раму 
Из этой строки я делаю массив на web-приложении.
Генерирую строку SQL.

Вариант в сообщении от Glory я думаю решит мою проблему. Спасибо!
11 авг 11, 18:08    [11105878]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить