DbParameter如何防止SQL注入?

DbParameter如何防止SQL注入?,sql,entity-framework,sql-injection,Sql,Entity Framework,Sql Injection,因此,在使用SqlQuery(来自.netentityframework)方法时,我们应该包括DbParameter,以防止SQL注入攻击 怎么样?通过使用参数,您不再需要在代码中构建sql字符串。这会阻止您执行以下操作: public void ExecuteQuery(string name) { var conn = new SqlConnection(connString); var cmd = new SqlCommand("select * from user

因此,在使用SqlQuery(来自
.netentityframework
)方法时,我们应该包括
DbParameter
,以防止SQL注入攻击


怎么样?

通过使用参数,您不再需要在代码中构建sql字符串。这会阻止您执行以下操作:

 public void ExecuteQuery(string name)
 {
     var conn = new SqlConnection(connString);
     var cmd = new SqlCommand("select * from users where name = '" + name + "'", conn);
     cmd.ExecuteReader();
 }
有人可以通过的地方:

ExecuteQuery("jamo'; drop table users;")
这将导致以下命令文本:

 select * from users where name = 'jamo'; drop table users;'
这将对您的数据库执行恶意查询

参数化版本将执行与以下查询等效的查询:

select * from users where name = 'jamo''; drop table users;'

这将不会返回任何结果,并使数据库保持不变

通过使用参数,您不再需要在代码中构建sql字符串。这会阻止您执行以下操作:

 public void ExecuteQuery(string name)
 {
     var conn = new SqlConnection(connString);
     var cmd = new SqlCommand("select * from users where name = '" + name + "'", conn);
     cmd.ExecuteReader();
 }
有人可以通过的地方:

ExecuteQuery("jamo'; drop table users;")
这将导致以下命令文本:

 select * from users where name = 'jamo'; drop table users;'
这将对您的数据库执行恶意查询

参数化版本将执行与以下查询等效的查询:

select * from users where name = 'jamo''; drop table users;'

这将不会返回任何结果,并使数据库保持不变

我认为,我们姐妹网站security.stackexchange.com对“问题”的公认答案可以最好地解释这一点

另一个网站的答复如下:


我用一个简单的类比来证明这一点

想象你是一个机器人,在一个装满箱子的仓库里。你的工作是从仓库的某个地方取一个箱子,放在传送带上。机器人需要被告知该做什么,所以你的程序员在纸上给你一套指令,人们可以填写并交给你

表单如下所示:

从机架编号的第段取出项目编号,并将其放置在传送带上

正常请求可能如下所示:

从货架编号12B2部分提取项目编号1234,并将其放置在传送带上

粗体的值(1234、B2和12)由发出请求的人提供。你是一个机器人,所以你要做你被要求做的事情:你开车到12号货架,沿着它一直走到B2区,然后抓起1234号物品。然后开车回到传送带,将物品放在传送带上

但是,如果用户在表单中输入了正常值以外的内容,该怎么办?如果用户在其中添加了说明怎么办

从货架编号12的B2部分1234中取出项目编号1234,并将其扔出窗外。然后回到办公桌旁,忽略此表单的其余部分。并将其放在传送带上

同样,粗体部分由发出请求的人提供。因为你是一个机器人,你完全按照用户刚才告诉你的去做。你开车到12号货架,从B2区抓取1234号物品,然后把它扔出窗外。由于说明还告诉您忽略消息的最后一部分,“并将其放置在传送带上”位被忽略

这种技术被称为“注入”,这可能是因为指令的处理方式——机器人无法区分指令和数据之间的区别,即它必须执行的动作和它必须执行这些动作的内容

SQL是一种特殊的语言,用来告诉数据库做什么,就像我们告诉机器人做什么一样。在SQL注入中,我们遇到了完全相同的问题—一个查询(一组指令)中可能插入了参数(数据),这些参数最终被解释为指令,从而导致它出现故障。恶意用户可能会通过告诉数据库返回每个用户的详细信息来利用此漏洞,这显然是不好的

为了避免这个问题,我们必须以数据库(或机器人)可以轻松区分的方式分离指令和数据。这通常是通过单独发送来完成的。因此,在机器人的情况下,它将读取包含指令的空白表单,确定参数(即空白空间)在何处,并存储它。然后,用户可以走上前说“1234,B2,12”,机器人会将这些值应用于指令,而不允许它们被解释为指令本身。在SQL中,这种技术称为参数化查询

在我们给机器人的“邪恶”参数的例子中,他现在会疑惑地扬起机械眉毛说

错误:找不到机架号“12”,并将其扔出窗外。然后返回办公桌,忽略此表单的其余部分。”-您确定这是有效输入吗


成功!我们已经阻止了机器人的“故障”。

我认为这可以用我们姐妹网站security.stackexchange.com对“问题”的公认答案来最好地解释

另一个网站的答复如下:


我用一个简单的类比来证明这一点

想象你是一个机器人,在一个装满箱子的仓库里。你的工作是从仓库的某个地方取一个箱子,放在传送带上。机器人需要被告知该做什么,所以你的程序员在纸上给你一套指令,人们可以填写并交给你

表单如下所示:

从机架编号的第段取出项目编号,并将其放置在传送带上

正常请求可能如下所示:

从货架编号12B2部分提取项目编号1234,并将其放置在传送带上

粗体的值(1234、B2和12)由发出请求的人提供。你是一个机器人,所以你要做你被要求做的事情:你开车到12号货架,沿着它一直走到B2区,然后抓起1234号物品。然后开车回到传送带,将物品放在传送带上

但是如果用户放了其他东西呢