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

tat*_*oto -1 c# sql-server sql-injection

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

Command.Parameters.Add()
Run Code Online (Sandbox Code Playgroud)

就像这里解释的那样

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

MSDN 没有太多这方面的信息。

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

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

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

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

Zoh*_*led 5

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

SELECT * FROM table WHERE Name = 'name'';drop table tableName;--'
Run Code Online (Sandbox Code Playgroud)

与如果您需要连接字符串来创建 sql 不同 - 这将创建一个如下查询:

SELECT * FROM table WHERE Name = 'name';drop table tableName;--
Run Code Online (Sandbox Code Playgroud)

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

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

顺便说一句,一些数据库引擎(例如 oracle)将只允许每次执行一个命令,但仍然可以使用name' OR 1=1它将创建的命令进行黑客攻击

SELECT * FROM table WHERE Name = 'name' OR 1=1
Run Code Online (Sandbox Code Playgroud)