在存储过程中使用通配符连接参数是不是安全?

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 并且无论你做什么都会强制扫描。

以上是关于在存储过程中使用通配符连接参数是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

DB2 参数通配符

为啥我可以使用有界通配符作为参数而不是方法中的返回类型? [复制]

Java泛型中使用通配符或有界类型参数是啥?

泛型通配符规则

SSH 连接过程设置环境变量

linux文件名匹配——通配符使用