【发布时间】:2016-04-14 14:07:01
【问题描述】:
stackoverflow 始终为我的问题提供正确答案,在我的编码生涯中为我提供了极大的帮助。然而,这个问题可能有点具体,希望它不会得到严厉的回应,因为这是我第一次在网站上发帖。
我有兴趣创建一个允许用户搜索各种列的 SQL Server 2012 存储过程。我相信我已经创建了一个存储过程,可以满足我的期望,但我担心 SQL 注入尝试。我是否已经考虑到 SQL 注入涵盖了所有可用的基础?如果没有,请教我如何绕过我的示例存储过程。请注意:为保护公司的数据结构,已对注明的一项进行了修改。
存储过程:
CREATE PROCEDURE [dbo].[spSearch]
(
@searchTerm varchar(50) = NULL
)
AS
set @searchTerm = LTRIM(RTRIM(@searchTerm));
select a.ID
,a.Col1
,a.Col2
,a.Col3
,a.Col4
,a.Col5
,b.Col1
from table1 a
left join table2 b on a.ID = b.ID
where (a.Col1 like '%' + @searchTerm + '%'
or a.Col2 like '%' + @searchTerm + '%'
or a.Col3 like '%' + @searchTerm + '%'
or a.Col4 like '%' + @searchTerm + '%'
or b.Col1 like '%' + @searchTerm + '%'
or b.Col2 like '%' + @searchTerm + '%'
or b.Col3 like '%' + @searchTerm + '%'
or b.Col4 like '%' + @searchTerm + '%'
or b.Col5 like '%' + @searchTerm + '%'
or b.Col6 like '%' + @searchTerm + '%')
GO
我主要担心将恶意 SQL 命令传递到 50 个字符的 varchar 参数中并让它在任何各种 where like 子句中执行的可能性。
【问题讨论】:
-
您已经介绍了使用参数的SQL注入攻击。敌对命令将被视为纯“搜索文本”,就好像您正在搜索敌对命令的字符串一样。
-
这不是这个级别的问题。它已经被参数化了,所以它的行为就像是在查找参数的值一样。
-
顺便说一句,您在获取此参数并发送到 SQL 服务器时可能仍会引入 SQL 注入攻击漏洞。
-
@CetinBasoz 这怎么可能?
-
@Siyual,在某个使用前端语言(比如 C#)的地方,您可能希望从用户那里获取“searchTerm”并调用此过程。如果你在前端不使用参数,你还是在引入 SQL 注入攻击点,不是吗?
标签: sql sql-server sql-server-2012 sql-injection