这个存储过程是否安全,避免SQL注入?
存储过程如下:这个存储过程是否安全,避免SQL注入?
CREATE PROCEDURE Foo
@bar varchar(100)
AS
SELECT * FROM tablename
WHERE columnname LIKE '%' + @bar + '%'
我已经试过各种传递字符串此存储过程,但对我来说,它看起来像这将是安全的,因为从之间的一切SQL注入和包括通配符会导致在一个单一的字符串。
如果您正在使用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,现货。参数化查询(对于那些仍然使用经典ado.net EF4 FTW的穷人) – RPM1984 2010-11-01 22:09:24
我试图在SQL Server Management Studio中执行此操作,并且没有发生注入。 exec Foo'; drop table test;'。你能否提供一个第二段代码如何被注入的例子? – 2010-11-01 22:46:28
我认为你对SQL注入的工作原理有些困惑。这不是你从SQL Server管理工作室做的事情。在我的例子中放入'zzzzzzzzzzzzzzzzzzzzz';选择'我在这里执行的代码';'进入myTextBox应该导致不需要的代码被执行。 – 2010-11-01 22:58:18
是的,这会将@bar中的所有数据解释为单个varchar(100)值。您仍然应该确保在您的应用中传递了某些内容,因为LIKE'%%'将默认返回数据库中的所有内容。
+1提到'LIKE %%'缺陷。 – RPM1984 2010-11-01 22:09:49
我将强制传递给存储过程的非空字符串值。谢谢。 – 2010-11-01 22:41:51
这不是需要保护的T-SQL,而是调用它的代码。你能显示你的代码吗? – RPM1984 2010-11-01 21:59:53
所有输入都很脏。 – Stephen 2010-11-01 22:02:01