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
我现在已经阅读了很多关于 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