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

C# 使用参数化SqlCommand是否使我的程序不受SQL注入的影响?,c#,.net,sql,security,sql-injection,C#,.net,Sql,Security,Sql Injection,我知道。现在,在我的C#代码中,我用以下内容组成参数化查询: 这会自动使我的代码对SQL注入免疫吗?我必须做些额外的事情吗?根据上的说明,“特殊输入字符仅对动态SQL构成威胁,而在使用参数化SQL时则不会。” 因此,我相信您可以安全地抵御SQL注入。在URL中使用标识符(如Idendity值)时可能存在一些逻辑风险,但这是另一种情况。SQL注入主要依赖于动态SQL的执行。换句话说,SQL语句是由SQL与用户输入的值串联而成的 为了完全避免SQL注入 保护自己免受SQL注入攻击并不十分困难。不受S

我知道。现在,在我的C#代码中,我用以下内容组成参数化查询:

这会自动使我的代码对SQL注入免疫吗?我必须做些额外的事情吗?

根据上的说明,“特殊输入字符仅对动态SQL构成威胁,而在使用参数化SQL时则不会。”


因此,我相信您可以安全地抵御SQL注入。在URL中使用标识符(如Idendity值)时可能存在一些逻辑风险,但这是另一种情况。

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

为了完全避免SQL注入

保护自己免受SQL注入攻击并不十分困难。不受SQL注入攻击影响的应用程序会验证和清理所有用户输入,从不使用动态SQL,使用权限很少的帐户执行,散列或加密其机密,并显示错误消息,这些消息几乎不会向黑客透露有用的信息。通过采取多层次的预防方法,你可以确信,如果一种防御措施被规避,你仍然会得到保护


中,我想说,对于参数化查询,对于您的特定的、可能是规范的示例,是的,这就足够了

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

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

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

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

如果您使用动态SQL,即使您正在通过参数传递它,您也不会免受SQL注入攻击。太糟糕了,SQL Server没有一个内置函数来清理参数。

引用?上述引用的MSDN文章似乎与您的答案相矛盾。对于动态查询,如果您没有不要在将参数发送到查询之前对其进行清理,您可以轻松地通过参数插入sql注入。请自己尝试。
cmd.CommandText = string.Format("SELECT * FROM {0} WHERE col = @col;", tableName);
cmd.Parameters.Add("@col", ...);