SQL 在 SQL 服务器 2012 上注入

SQL Injection on SQL Server 2012

Whosebug 对我的问题总是有正确的答案,因此在我的编码生涯中帮了我大忙。然而,这个问题可能有点具体,希望它不会得到严厉的回应,因为这是我第一次在网站上发帖。

我有兴趣创建一个 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 子句中的任何一个中执行的可能性。

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

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