使用参数化的SqlCommand是否使我的程序免受SQL注入?

时间:2011-08-24 11:38:22

标签: c# .net sql security sql-injection

我知道SQL injection is rather dangerous。现在,在我的C#代码中,我使用SqlCommand class编译参数化查询:

SqlCommand command = ...;
command.CommandText = "SELECT * FROM Jobs WHERE JobId = @JobId;";
command.Parameters.Add("@JobId", SqlDbType.UniqueIdentifier ).Value = actualGuid;
command.ExecuteNonQuery();

这会自动使我的代码免受SQL注入吗?我是否需要做额外的事情?

5 个答案:

答案 0 :(得分:25)

对于参数化查询,我会说你的特定的,可能是规范的例子,是的,这就足够了。

然而,人们有时会编写这样的代码

cmd.CommandText = string.Format("SELECT * FROM {0} WHERE col = @col;", tableName);
cmd.Parameters.Add("@col", ...);

因为根本没有办法将tablename本身作为参数传递,并且有时存在的愿望 - 错误或不存在。它似乎经常被忽略,tableName(除非可能只读取一组不从任何输入派生的静态/常量值)确实允许SQL注入。

答案 1 :(得分:17)

根据关于this MSDN Article的注释,“特殊输入字符仅对动态SQL构成威胁,而不是在使用参数化SQL时。”

所以我相信你对SQL注入是安全的。在您的网址中使用Idendity Values等标识符时可能存在一些逻辑风险,但这是另一个故事。

答案 2 :(得分:8)

SQL注入主要依赖于动态SQL的执行。换句话说,SQL语句与用户输入值的串联构造的SQL语句。

完全避免SQL注入,

  

保护自己免受SQL注入攻击并不是很困难。不受SQL注入攻击影响的应用程序验证并清理所有用户输入,从不使用动态SQL,使用具有少量权限的帐户执行,散列或加密其秘密,并显示错误消息,向黑客显示很少的有用信息。通过采用多层次的预防方法,您可以放心,如果一个辩护被规避,您仍然会受到保护。

来自MSDN

答案 3 :(得分:1)

使用SqlCommand是一种非常好的做法,只要你不在任何地方连接SQL字符串(包括你调用的任何存储过程内部 - 即避免使用动态SQL),你就可以免受SQL注入攻击。

答案 4 :(得分:-3)

如果使用动态sql,即使通过参数传递它,也不会免于SQL注入。太糟糕的SQL Server没有内置函数来清理参数