Command.Parameters.Add() 如何防止 SQL 注入? C#

How does Command.Parameters.Add() prevent SQL injection? C#

我现在已经阅读了很多关于 SQL 注入并试图阻止它的文章。我看过几篇关于如何以及为什么使用

的文章
Command.Parameters.Add()

like explained here.

但我仍在寻找它如何以及为何阻止 SQL 注入的答案。

MSDN 没有太多关于此的信息。

这是我如何使用它的示例:

SqlCommand myCommand = new SqlCommand("SELECT * FROM table WHERE name = @name ", myConnection);
myCommand.Parameters.Add("@name", SqlDbType.NVarChar, 20).Value = "MaMu2";

我的代码对 SQL 注入是否安全,还是我错了?

编辑:主要问题是:它在内部是如何工作的?

简短版本: 基本上,sql 引擎撕裂 sql 参数作为值的占位符。
这意味着即使您的 @Name 参数是 name';drop table tableName;--,您最终也会得到这样的查询:

SELECT * FROM table WHERE Name = 'name'';drop table tableName;--'

相对于如果您要连接字符串以创建 sql - 这将创建如下查询:

SELECT * FROM table WHERE Name = 'name';drop table tableName;--

如您所见,第一个查询是安全的,而第二个则不是。它允许您向 sql 添加有害代码。

而如果您使用参数,您的有害代码将不会被视为代码。
重要说明:如果您将参数发送到使用这些参数创建的存储过程和 运行 动态 sql,您仍然不安全 - 因为它是在存储过程中连接字符串。

附带说明,某些数据库引擎(例如 oracle)在每次执行中只允许一个命令,但仍然可以使用 name' OR 1=1 进行黑客攻击,这将创建

SELECT * FROM table WHERE Name = 'name' OR 1=1