2017-05-08 120 views
-2

我现在读了很多关于SQL注入并试图阻止它。我已经遇到了几篇文章关于如何以及为什么使用Command.Parameters.Add()如何防止SQL注入? C#

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注入安全的,还是我错了?

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

+0

是的,你的代码是针对SQL注入安全受到黑客攻击。 – Steve

+0

第二个问题的答案在这里给出:http://stackoverflow.com/questions/4892166/how-does-sqlparameter-prevent-sql-injection –

回答

0

简短版本: 基本上,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的存储过程,则仍然不安全 - 因为它在存储过程内连接了字符串。

作为一个方面说明,一些数据库引擎,如甲骨文将只允许一个命令,分别执行,但仍然可以使用name' OR 1=1,将创建

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