【问题标题】:SQL Injection on SQL Server 2012SQL Server 2012 上的 SQL 注入
【发布时间】: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


【解决方案1】:

这实际上取决于您如何从代码中调用 SP。存储过程是 self 对 sql 注入不安全。当您使用参数化函数时,您可能没问题。当您以字符串形式发送 sql 查询时,仍然存在 sql 注入问题。主要问题是代码中的字符串连接。如果您的参数来自不受信任的来源,则字符串连接永远不会安全。 Do Stored Procedures Protect Against SQL Injection?

基本课程是编写没有任何字符串连接的存储过程。

【讨论】:

  • 谢谢,彼得!我没有计划在调用这个存储过程时使用字符串连接,所以我倾向于这是一个相当安全的存储过程。
  • 您正在 sp: '%' + @searchTerm + '%' 中进行字符串连接。所以 sp 它本身并不安全。看来您调用 sp 的方法使使用安全。
猜你喜欢
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
相关资源
最近更新 更多