Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 простая фильтрация от sql injection  [new]
был тут недавно...
Guest
можно покритиковать след. набросок кода:
-- здесь ведем лог атак
CREATE TABLE [dbo].[AlertHack](
	[idrec] [int] IDENTITY(1,1) NOT NULL,
	[HostName] [varchar](255) NULL,
	[loginame] [varchar](255) NULL,
	[program_name] [varchar](255) NULL,
	[EventDateTime] [datetime] NULL CONSTRAINT [DF_AlertHack_EventDateTime]  DEFAULT (getdate()),
	[ObjectName] [varchar](255) NULL,
	[ParamStr] [varchar](max)
)

go

---------------------------------------------------------------
-- этой процедурой делаем проверку
CREATE PROCEDURE [dbo].[ChkHack] 
(
	@ObjectName	varchar(255), -- имя защищаемой функции/хранимки
	@sControl varchar(max), -- соединить все строковые параметры защищаемой функции/хранимки в одну строку
	@Cnt int output
)
AS
BEGIN
	SET NOCOUNT ON;
-------------------

declare @i int, @sControlTmp varchar(max), @sFilter varchar(50)

set @sControlTmp=@sControl
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'
union all   select 'union'
union all   select 'like'
union all   select 'where'

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

if (@Cnt>0)
begin
insert into alerthack 
			(
			[HostName]
           ,[loginame]
           ,[program_name]
           ,[ObjectName]
           ,[ParamStr]
			)
		select 
		    s.[HostName]
           ,s.[loginame]
           ,s.[program_name]
		   ,@ObjectName
		   ,@sControl
from master..sysprocesses s where spid = @@SPID
End

Return @Cnt
-------------------
END

/*
тесты....

declare @Cnt int
set @Cnt =0
exec ChkHack 'тестовичек','dsgasggf''select9drhgdafh',@Cnt
select @Cnt
select * from alerthack 
truncate table alerthack

использовать:
Вызывать ChkHack в начале любой функции/хранимки и по результатам проверки
принимать решение - продолжать обработку или прекратить.

При вызове ChkHack  - передать в нее имя защищаемой функции/хранимки.
И соединить все строковые параметры в одну строку и передать как второй параметр ChkHack

*/
go


При поиске по "sql injection" можно найти оч. много разговоров, но мало кода :))
жаль, не имею времени все перечитать...
28 окт 09, 16:42    [7851426]     Ответить | Цитировать Сообщить модератору
 Re: простая фильтрация от sql injection  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
Кода очень мало как раз с тех пор, как придумали параметры.
28 окт 09, 16:48    [7851483]     Ответить | Цитировать Сообщить модератору
 Re: простая фильтрация от sql injection  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
Ну и фолсить будет направо и налево, там, где используется англ. язык.
28 окт 09, 16:49    [7851499]     Ответить | Цитировать Сообщить модератору
 Re: простая фильтрация от sql injection  [new]
был тут недавно...
Guest
так вот строковые параметры и проверяем...
к моему серверу коннектится неск. десятков различных программ, написаных на
почти на всех языках... в разные годы разными рограммистами (за последние 10 лет )
нет никаких гарантий корректного заполнения параметров.
Нужно защищаться прямо в коде вызываемых хранимок, проверяя все входящие строковые параметры.
28 окт 09, 16:54    [7851543]     Ответить | Цитировать Сообщить модератору
 Re: простая фильтрация от sql injection  [new]
был тут недавно...
Guest
Да, конечно, такая проверка сильно зависит от предметной области -
у нас англ. яз не ожидается нигде, просто такова наша специфика...
28 окт 09, 16:56    [7851575]     Ответить | Цитировать Сообщить модератору
 Re: простая фильтрация от sql injection  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36801
был тут недавно...
так вот строковые параметры и проверяем...
к моему серверу коннектится неск. десятков различных программ, написаных на
почти на всех языках... в разные годы разными рограммистами (за последние 10 лет )
нет никаких гарантий корректного заполнения параметров.
Нужно защищаться прямо в коде вызываемых хранимок, проверяя все входящие строковые параметры.
Эта проверка имеет хоть какой то смысл, если вы в процедурах используете динамический sql. Если его нет, то хоть обпередавайся "drop database ...", он никогда не сработает.
28 окт 09, 17:11    [7851702]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить