Скажем у вас есть каталог на продукты для вашего веб-размера и ваша страница поиска позволяет осуществлять поиск по названию продукта, описание, цвет и размер (скажем, вы продаете бюстгальтеры):
create table [products] (
product_id int identity(1,1) not null primary key
, name varchar(256)
, description varchar(max)
, color varchar(256)
, size varchar(256));
GO
create procedure usp_dynamicSearch
@product varchar(256) = NULL
, @description varchar(256) = NULL
, @color varchar(256) = NULL
, @size varchar(256) = NULL
as
begin
set nocount on;
declare @sql nvarchar(max)
, @and nvarchar(5);
set @sql = N'SELECT
product_id, name, description, color, size
FROM products
WHERE ';
set @and = N'';
if (@product is not null)
begin
set @sql = @sql + N'name LIKE ''' + @product + N'''';
set @and = N' AND ';
end
if (@description is not null)
begin
set @sql = @sql + @and + N'description LIKE ''' + @description + N'''';
set @and = N' AND ';
end
if (@color is not null)
begin
set @sql = @sql + @and + N'color = ''' + @color + N'''';
set @and = N' AND ';
end
if (@size is not null)
begin
set @sql = @sql + @and + N'size = ''' + @size + N'''';
end
exec sp_executesql @sql;
end
GO
Вы можете использовать хранимую процедуру, динамически создает SQL-запрос для поиска. Вы вызываете его передачи параметров:
exec usp_dynamicSearch @color = N'Red', @size = N'58-DD';
Поскольку процедура создает динамический SQL в небрежным образом, по-прежнему открыт для SQL инъекций:
exec usp_dynamicSearch @color = N'Red', @size = N''';
INSERT INTO products (name, description)
values (''31337'', ''haxorz!'');
--';
Нежелательный продукт sinserted в каталоге (сделать это нападение bening ...).В этом случае подход щее исправление использовать параметры в динамическом SQL, а также и в дальнейшем передать параметры в sp_executesql
вызова:
alter procedure usp_dynamicSearch
@product varchar(256) = NULL
, @description varchar(256) = NULL
, @color varchar(256) = NULL
, @size varchar(256) = NULL
as
begin
set nocount on;
declare @sql nvarchar(max)
, @and nvarchar(5);
set @sql = N'SELECT
product_id, name, description, color, size
FROM products
WHERE ';
set @and = N'';
if (@product is not null)
begin
set @sql = @sql + N'name LIKE @product';
set @and = N' AND ';
end
if (@description is not null)
begin
set @sql = @sql + @and + N'description LIKE @description';
set @and = N' AND ';
end
if (@color is not null)
begin
set @sql = @sql + @and + N'color = @color';
set @and = N' AND ';
end
if (@size is not null)
begin
set @sql = @sql + @and + N'size = @size';
end
exec sp_executesql @sql , N'@product varchar(256)
, @description varchar(256)
, @color varchar(256)
, @size varchar(256)'
, @product, @description, @color, @size;
end
GO
Так sp_executesql и динамический SQL является основной проблемой. Кроме этого, существуют также различные системные процедуры, которые создают динамический SQL под обложками, и исторически некоторые из них оказались уязвимыми, особенно на SQL 2000.
Я искал * кратко * месяцев назад, и это единственная уязвимость, которую я мог найти. Если вам нужно использовать sp_executesql, вы все равно получите большие проблемы. – mxmissile
Я думаю, что то же самое можно сказать и для выполнения динамических запросов «exec» select * from tab, где f1 = '+ @ param1 " – pauloya
Я не использую sp_executesql. –