这个存储过程是否安全,避免SQL注入?

问题描述:

存储过程如下:这个存储过程是否安全,避免SQL注入?

CREATE PROCEDURE Foo 
    @bar varchar(100) 
AS 

SELECT * FROM tablename 
WHERE columnname LIKE '%' + @bar + '%' 

我已经试过各种传递字符串此存储过程,但对我来说,它看起来像这将是安全的,因为从之间的一切SQL注入和包括通配符会导致在一个单一的字符串。

+2

这不是需要保护的T-SQL,而是调用它的代码。你能显示你的代码吗? – RPM1984 2010-11-01 21:59:53

+0

所有输入都很脏。 – Stephen 2010-11-01 22:02:01

如果您正在使用C#和您的代码如下所示:

SqlCommand command = new SqlCommand("Foo", connection); 
command.CommandType = CommandType.StoredProcedure; 
command.Parameters.AddWithValue("@bar", myTextBox.Text); 

然后是的!

如果它看起来像这样:

SqlCommand command = new SqlCommand("EXEC Foo '" + myTextBox.Text + "'", connection); 

则没有!

+1

+1,现货。参数化查询(对于那些仍然使用经典ado.net EF4 FTW的穷人) – RPM1984 2010-11-01 22:09:24

+0

我试图在SQL Server Management Studio中执行此操作,并且没有发生注入。 exec Foo'; drop table test;'。你能否提供一个第二段代码如何被注入的例子? – 2010-11-01 22:46:28

+0

我认为你对SQL注入的工作原理有些困惑。这不是你从SQL Server管理工作室做的事情。在我的例子中放入'zzzzzzzzzzzzzzzzzzzzz';选择'我在这里执行的代码';'进入myTextBox应该导致不需要的代码被执行。 – 2010-11-01 22:58:18

是的,这会将@bar中的所有数据解释为单个varchar(100)值。您仍然应该确保在您的应用中传递了某些内容,因为LIKE'%%'将默认返回数据库中的所有内容。

+0

+1提到'LIKE %%'缺陷。 – RPM1984 2010-11-01 22:09:49

+0

我将强制传递给存储过程的非空字符串值。谢谢。 – 2010-11-01 22:41:51