在存储过程中使用通配符连接参数是不是安全?
Posted
技术标签:
【中文标题】在存储过程中使用通配符连接参数是不是安全?【英文标题】:Is concatenating parameters with wildcards safe in stored procs?在存储过程中使用通配符连接参数是否安全? 【发布时间】:2015-11-14 15:16:08 【问题描述】:在存储过程中将参数值与 % 连接是否可以防止 SQL 注入?
我有一个存储过程,允许用户在表的列中搜索包含给定值的记录:
CREATE PROC sp_Search
@SearchValue NVARCHAR(255)
AS
BEGIN
SELECT * FROM TableA WHERE ColumnA LIKE '%' + @SearchValue + '%' OR ColumnB LIKE '%' + @SearchValue + '%'
END
【问题讨论】:
是的。您只是在比较一个值。问题是当您尝试创建动态 sql 时。 我会推荐两件事。不要添加 sp_ 前缀。要么选择不同的前缀,要么完全放弃它们(我的偏好)。 sqlperformance.com/2012/10/t-sql-queries/sp_prefix 第二件事是您有一个前导通配符,它使您的查询变为非SARGable,并且没有多少索引会帮助提高性能。如果有可能避免使用前导通配符,您应该这样做。 另一个问题是TableA有多大,你如何尝试搜索,记住'%term%'不是SARG-able。 【参考方案1】:你可以吗?
CHARINDEX(@SearchValue, [COLUMNA]) > 0
OR CHARINDEX(@SearchValue, [COLUMNB]) > 0
【讨论】:
这也是 nonSARGable 并且无论你做什么都会强制扫描。以上是关于在存储过程中使用通配符连接参数是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章