Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 как защититься от sql-инъкциий  [new]
lenash
Member

Откуда:
Сообщений: 500
Поскажите, как нужно исправить запрос, чтобы защиться от sql-инъекций.
Вот такое подключение и запрос. В переменной x значение, которое берется из адресной строки.
<%
Set conx = Server.CreateObject("ADODB.Connection")
conx.Open "DSN=base"

SQL = "SELECT ID, date, ... guid FROM posts WHERE post_status = 'publish' and id="& x
Set rs = Server.CreateObject("ADODB.Recordset")
Set rs = conx.Execute(SQL)
%>

Что нужно сделать с переменной, чтобы введенное злоумышленником значение не выдало никакого результата?
17 фев 14, 13:41    [15576958]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
Konst_One
Member

Откуда:
Сообщений: 11677
переписать через ADODB.Command или StoredProcedure
17 фев 14, 13:43    [15576976]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
lenash
Member

Откуда:
Сообщений: 500
Почему через ADODB.Command ?
В интернете рекомендуют вот так:
Фильтруйте специальные символы во всех строках в:


- любых данных, вводимых пользователем
- URL параметрах
- Cookie

А можно пример, как это делается?
17 фев 14, 13:56    [15577049]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
Glory
Member

Откуда:
Сообщений: 104751
lenash
А можно пример, как это делается?

Пример как найти специальные, т.е. не буквы и не цифры, символы в строке ??
17 фев 14, 13:58    [15577058]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
Glory
Member

Откуда:
Сообщений: 104751
lenash
Почему через ADODB.Command ?

Потому что ключевое слово - Параметры/Parameters

Сообщение было отредактировано: 17 фев 14, 13:59
17 фев 14, 13:59    [15577070]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
lenash
Member

Откуда:
Сообщений: 500
Да, пример "как найти специальные, т.е. не буквы и не цифры, символы в строке ?? "
17 фев 14, 14:14    [15577177]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
Glory
Member

Откуда:
Сообщений: 104751
lenash
Да, пример "как найти специальные, т.е. не буквы и не цифры, символы в строке ?? "

Спросите в форуме ASP, как там ищут подстроки в строках
17 фев 14, 14:16    [15577188]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
lenash
Member

Откуда:
Сообщений: 500
Я просто не совсем понимаю, что мы должны делать чтобы не дать отработать инъекциям?
Чтобы значение x было только тем значением, при котором запрос отрабатывается? Чтобы не было ошибок, по которым можно было что либо узнать о базе данных?
17 фев 14, 14:24    [15577254]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
Konst_One
Member

Откуда:
Сообщений: 11677
ADODB.Command с параметрами и не будет у вас SQL-инъекций
17 фев 14, 14:25    [15577264]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
Glory
Member

Откуда:
Сообщений: 104751
lenash
Я просто не совсем понимаю, что мы должны делать чтобы не дать отработать инъекциям?

Не передавать спец.смиволы в выполняемую строку.
А лучше всего, начать использовать параметры
17 фев 14, 14:27    [15577278]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
lenash
Member

Откуда:
Сообщений: 500
Подключение с помощью ADO Command и все? и с передаваемыми переменными ничего не делать?
17 фев 14, 14:32    [15577331]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
Konst_One
Member

Откуда:
Сообщений: 11677
переменные будут входящими параметрами у команды. если вдруг кто-то попытается инъекцию сделать, то просто будет ошибка выполнения вашей команды и все.
17 фев 14, 14:34    [15577350]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
Glory
Member

Откуда:
Сообщений: 104751
lenash
Подключение с помощью ADO Command и все? и с передаваемыми переменными ничего не делать?

Млин
_па_ра_мет_ры - http://asp.happycodings.com/DataAccess/code8.html
17 фев 14, 14:35    [15577358]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709
Защита от SQL INJECTION очень проста -- надо не путать код и данные. Код отдельно, данные -- отдельно.
Для этого надо использовать bind-параметры. Они всегда интерпретируются только как данные.


lenash
Поскажите, как нужно исправить запрос, чтобы защиться от sql-инъекций.
Вот такое подключение и запрос. В переменной x значение, которое берется из адресной строки.
<%
Set conx = Server.CreateObject("ADODB.Connection")
conx.Open "DSN=base"

SQL = "SELECT ID, date, ... guid FROM posts WHERE post_status = 'publish' and id="& x
Set rs = Server.CreateObject("ADODB.Recordset")
Set rs = conx.Execute(SQL)
%>

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


На этом языке я лично не знаю, как использовать параметры. Если это невозможно вообще, то язык надо выкинуть и использовать другой.
17 фев 14, 14:42    [15577421]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
ART-CODE
Member

Откуда:
Сообщений: 1105
пример на VBS, но ASP по сути то же самое
В примере вызывается хранимка на сервере, с параметрами
(там происходит установка статуса письма)
+

VBS
Function SWS_MailSetStatus(StrConnection ,IntStatus , StrSWS_MailID , StrStatusComment )

' @StrStatus: 0 = черновик, 2 = отправлено клиентом, 5 = исполнено, 6 = отказ, 7 = удалено, 11 = отправлено оператором

Dim c
Dim prmStrSWS_MailID
Dim prmStrStatus
Dim prmStrStatusComment
Dim Cmd

Set c = CreateObject("ADODB.Connection")
c.Provider = "MSDASQL"
c.CursorLocation = 3
c.ConnectionString = StrConnection
c.Open

Set Cmd = CreateObject("ADODB.Command")

Cmd.ActiveConnection = c
Cmd.CommandText = "SWS_MailSetStatus"
Cmd.CommandTimeout = 15
Cmd.CommandType = 4

Set prmStrStatus = CreateObject("ADODB.Parameter")
prmStrStatus.Type = 200
prmStrStatus.Size = 200
prmStrStatus.Direction = 1
prmStrStatus.Value = CStr(IntStatus)
prmStrStatus.Name = "@StrStatus"

Set prmStrSWS_MailID = CreateObject("ADODB.Parameter")
prmStrSWS_MailID.Type = 200
prmStrSWS_MailID.Size = 200
prmStrSWS_MailID.Direction = 1
prmStrSWS_MailID.Value = StrSWS_MailID
prmStrSWS_MailID.Name = "@StrSWS_MailID"

Set prmStrStatusComment = CreateObject("ADODB.Parameter")
prmStrStatusComment.Type = 200
prmStrStatusComment.Size = 200
prmStrStatusComment.Direction = 1
prmStrStatusComment.Value = StrStatusComment
prmStrStatusComment.Name = "@StrStatusComment"

Cmd.Parameters.Append prmStrStatus
Cmd.Parameters.Append prmStrSWS_MailID
Cmd.Parameters.Append prmStrStatusComment

Cmd.Execute

Set prmStrStatus = Nothing
Set prmIntSWS_MailID = Nothing
Set prmStrStatusComment = Nothing
Set Cmd = Nothing
Set c = Nothing


End Function


Вызов через параметры защитит только от инъекции через_этот_код
А если программный код самого файла будет изменен ?

Поэтому в хранимке - тоже нужно фильтровать входящие параметры.
Мы-же не собираемся доверять вызвавшему нас приложению :)

+
Declare @sControlTmp varchar(max), @sFilter varchar(50)

set @sControlTmp=@sInControl --  это входящий параметр хранимки, записываем в локальную переменную.
set @sFilter='%[^a-zA-Z0-9 ]%'

select @i = patindex(@sFilter, @sControlTmp)
while @i > 0
begin
	select @sControlTmp = replace(@sControlTmp, substring(@sControlTmp, @i, 1), '')
	select @i = patindex(@sFilter, @sControlTmp)
end

select @sControlTmp -- теперь у нас чистая, пригодная к использованию строка

Неплохо было бы еще ее сравнить с таблицей запрещенных ключевых слов:

Create table #ControlWords
	( 
	  [cw] varchar(50)
	)

insert into #ControlWords ([cw])
		    select 'select' as [cw]
union all   select 'drop'
union all   select 'delete'
union all   select 'insert'
union all   select 'update'
union all   select 'exec'
union all   select 'into'
union all   select 'create'
union all   select 'alter'
union all   select 'function'
union all   select 'procedure'
union all   select 'trigger'
union all   select 'table'
union all   select 'database'
union all   select 'view'
union all   select 'rowset'
union all   select 'dataset'
union all   select 'sp_oacreate'
union all   select 'replace'
union all   select 'substring'
union all   select 'scripting'
union all   select 'shell'

Set @Cnt=0
Select @Cnt=Count(*) from #ControlWords where @sControlTmp like '%'+cw+'%'
drop table #ControlWords

if (@Cnt>0)
begin
-- поднимаем тревогу: нас ломают !!!
17 фев 14, 17:01    [15578556]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
http://sqlsaturday.com/viewsession.aspx?sat=216&sessionid=13422
SQL Injection - вы готовы к защите?

Этой проблеме очень много лет, но начинающие (и не только) разработчики баз данных продолжают совершать ошибки, которые делают возможным этот тип атаки. Узнайте как сделать правильное решение и защитить ваши базы данных.
17 фев 14, 17:05    [15578576]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
Konst_One
Member

Откуда:
Сообщений: 11677
что за ерунда в ХП? не нужно этого делать, если только у вас там не динамика на основе входных параметров
17 фев 14, 17:05    [15578579]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
ART-CODE
Member

Откуда:
Сообщений: 1105
Konst_One,
Согласен, но поскольку нет никаких гарантий о дальнейшей судьбе строки,
кто и как ее потом будет использовать.
Причем может быть и не сразу, а через какое-то время.
17 фев 14, 17:09    [15578603]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
lenash
Member

Откуда:
Сообщений: 500
С применением параметров и хранимых процедур я сделать сейчас не смогу(
Поскажите, пожалуйста, как сделать проверку на тип данных и отклонять ненужные символы?
18 фев 14, 11:00    [15580851]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
Glory
Member

Откуда:
Сообщений: 104751
lenash
Поскажите, пожалуйста, как сделать проверку на тип данных и отклонять ненужные символы?

Вам написать скрипт на TSQL что ли ?
Или вы все же пишите на ASP ?
18 фев 14, 11:01    [15580859]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
lenash
Member

Откуда:
Сообщений: 500
с помощью каких функций это сделать?
18 фев 14, 11:26    [15581044]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
Glory
Member

Откуда:
Сообщений: 104751
lenash
с помощью каких функций это сделать?

Форум по ASP находится здесь
18 фев 14, 11:28    [15581061]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
lenash
Member

Откуда:
Сообщений: 500
Спасибо.
18 фев 14, 11:36    [15581139]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
lenash
Member

Откуда:
Сообщений: 500
Glory, а напишите, пожалуйста, скрипт на TSQL.
18 фев 14, 14:10    [15582428]     Ответить | Цитировать Сообщить модератору
 Re: как защититься от sql-инъкциий  [new]
Stanislav
Member

Откуда: Донецк
Сообщений: 631
lenash
Glory, а напишите, пожалуйста, скрипт на TSQL.

:-)

Вам их уже 100 штук предложили.
Добавьте параметры в свой запрос и все.
18 фев 14, 14:14    [15582454]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить