【发布时间】:2013-06-04 12:24:35
【问题描述】:
我有存储过程
if OBJECT_ID(N'dbo.spGetProducts') is not null
drop procedure dbo.spGetProducts
go
CREATE procedure [dbo].[spGetProducts]
(
@sort_col varchar(100), @sort_dir varchar(4),
@start int, @num int, @filters nvarchar(2000)) as
begin
declare @end int
declare
@res table
(
row_num int,
product_name nvarchar(max)
)
set @end = @start+@num
insert into @res
EXEC
(
'select * from
(
select (ROW_NUMBER() OVER (ORDER BY '+@sort_col+' '+@sort_dir+')) row_num,
* FROM (select product_name from Products where '+@filters+') as x
) as tmp where row_num between '+@start+' and '+@end
) select row_num, product_name from @res
end
go
当我使用latin characters 执行存储过程时效果很好,但是当我使用cyrillic 字符时does not return anything..
这是执行行:
-
拉丁字符 - 工作:
exec dbo.spGetProducts 'product_name','desc',0,50,' product_name like N''%abs%''' -
西里尔字符 - 不工作:
exec dbo.spGetProducts 'product_name','desc',0,50,' product_name like N''%абв%'''
我也手动设置要使用的存储过程
'product_name like N''%абв%'''
入行
select product_name from Products where '+@filters+'
即
select product_name from Products where product_name like N''%абв%'''
而且 这个 WORKS,所以我不知道如何解决这个问题..
【问题讨论】:
-
首先,我必须指出,将 where 子句作为参数传递并在动态 SQL 中使用它确实是个坏主意,因为它容易受到 SQL 注入的攻击。我不知道从某个应用程序中输入了什么参数,但想象一下,如果有人给您发送类似
@filters = '1=1)AS x)AS y; DROP TABLE Products; --'的内容 -
感谢您的建议,我知道这很容易受到 SQL 注入的影响,但我自己生成过滤器,因此没有 sql 注入的空间。
标签: sql sql-server tsql stored-procedures