【问题标题】: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

标签: sql sql-server stored-procedures sql-injection


【解决方案1】:

你可以吗?

   CHARINDEX(@SearchValue, [COLUMNA]) > 0 
OR CHARINDEX(@SearchValue, [COLUMNB]) > 0

【讨论】:

  • 这也是 nonSARGable 并且无论你做什么都会强制扫描。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-06
  • 2020-06-28
  • 2021-01-25
  • 2018-12-20
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多