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

本文关键字:SQL 注入 影响 程序 参数 SqlCommand 是否 我的 | 更新日期: 2023-09-27 18:06:35

我知道SQL注入相当危险。现在在我的c#代码中,我用SqlCommand类编写参数化查询:

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

这将自动使我的代码免疫SQL注入?我还需要做些什么吗?

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

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

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

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

,因为根本没有办法将表名本身作为参数传递,而且有时存在这样做的愿望-无论是否被误导。它似乎经常被忽视,tableName(除非可能只从一组静态/恒定值中读取,不派生任何输入)确实允许SQL注入。

根据这篇MSDN文章的注释,"特殊输入字符仅对动态SQL构成威胁,而在使用参数化SQL时则不会。"

所以我相信你是安全的SQL注入。在url中使用标识符(如身份值)可能存在一些逻辑风险,但这是另一回事。

SQL注入主要依赖于动态SQL的执行。换句话说,SQL语句是由SQL和用户输入的值连接而成的。

为了完全避免SQL注入,

保护自己免受SQL注入攻击并不是很难。不受SQL注入攻击的应用程序会验证和清除所有用户输入,从不使用动态SQL,使用具有很少特权的帐户执行,对其秘密进行散列或加密,并提供错误消息,这些错误消息几乎没有向黑客透露有用的信息。通过遵循多层预防方法,您可以确保即使一个防御被绕过,您仍将受到保护。

从MSDN

使用SqlCommand是一个很好的实践,只要你不将SQL字符串连接在任何地方(包括在你调用的任何存储过程中——即避免动态SQL),你将免受SQL注入攻击。

如果使用动态SQL,即使通过参数传递SQL,也不能避免SQL注入。可惜SQL Server没有内置函数来清理参数