根据这个http://msdn.microsoft.com/en-us/library/gg696545%28v=vs.113%29.aspx,当我们使用SqlQuery(来自.Net EntityFramework
)方法时,我们应该包含DbParameter
以防止SQL注入攻击。
怎么回事?
答案 0 :(得分:4)
通过使用参数,您不再需要在代码中构建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;'
哪个会返回没有结果并保持数据库完好无损。
答案 1 :(得分:2)
我认为最好用多项式对#34; How can I explain SQL injection without technical jargon?"来自我们的姐妹网站security.stackexchange.com。
从其他网站回答如下:
我演示它完成非技术人员的方式是一个简单的类比。
想象一下,你是一个装满盒子的仓库里的机器人。你的工作是从仓库的某个地方取一个盒子,然后把它放在传送带上。机器人需要被告知要做什么,所以你的程序员已经在纸质表格上给了你一套说明,人们可以填写并交给你。
表格如下:
从货架编号____的____部分取取料号____,并将其放在传送带上。
正常请求可能如下所示:
从货架编号 12 的 B2 部分取取商品编号 1234 ,然后将其放在传送带上。
以粗体显示的值(1234,B2和12)由发出请求的人员提供。你是一个机器人,所以你做了你告诉你的事情:你开到12号机架,向下走到你到达B2部分,然后抓住1234项。然后你开车回传送带然后放下将物品放在上面。
但是如果用户在表单中添加了除正常值之外的其他内容,该怎么办?如果用户在其中添加了说明怎么办?
从机架编号 12的 B2 部分获取项目编号 1234 ,然后将其扔出窗口。然后回到你的办公桌,忽略这个表格的其余部分。并将它放在传送带上。
同样,粗体部分由发出请求的人提供。既然你是一个机器人,那么你就完全按照用户的要求去做。你开车到12号机架,从B2部分抓住1234项,然后把它扔出窗外。由于说明书还告诉您忽略信息的最后部分,然后将其放在传送带上。位被忽略。
这种技术被称为"注射",由于处理指令的方式,它可能成为可能 - 机器人无法区分指令和数据,即它必须执行的操作,以及执行这些操作所必需的操作。
SQL是一种特殊语言,用于告诉数据库要做什么,与我们告诉机器人做什么的方式类似。在SQL注入中,我们遇到完全相同的问题 - 查询(一组指令)可能会在其中插入参数(数据),最终被解释为指令,导致其出现故障。恶意用户可以通过告诉数据库返回每个用户的详细信息来利用这一点,这显然不是很好!
为了避免这个问题,我们必须以数据库(或机器人)可以轻易区分的方式分离指令和数据。这通常通过单独发送来完成。因此,在机器人的情况下,它将读取包含指令的空白表格,识别参数(即空白空间)的位置,并存储它。然后用户可以走路并说出" 1234,B2,12"并且机器人将这些值应用于指令,而不允许它们被解释为指令本身。在SQL中,这种技术称为参数化查询。
对于"邪恶"我们给机器人的参数,他现在要古怪地抬起机械眉毛并说出
错误:找不到机架编号" 12,并将其扔出窗外。然后回到你的办公桌,忽略这个表格的其余部分。" - 你确定这是一个有效的输入吗?
成功!我们已经停止了机器人"故障"。