SQLParameter如何防止SQL注入?


Answers:


78

基本上,当执行SQLCommandusing时SQLParameters,永远不会将参数直接插入语句中。而是调用一个称为的系统存储过程,sp_executesql并为其指定SQL字符串和参数数组。

当按原样使用时,参数将被隔离并视为数据,而不必从语句中解析出来(因此可能会更改它),因此永远无法“执行”参数包含的内容。您将仅收到一个严重错误,即参数值在某种程度上无效。


1
如果在SQL(在这种情况下为TSQL)不支持变量的地方尝试使用变量,也会遇到错误。IE:FROM子句,来表示一个逗号的单个参数的在分隔的列表IN子句等
OMG小马

1
我认为这不能回答问题。您可以使用SQLParameter类来调用存储过程,该类将参数传递给该过程,但不调用sp_executesql。串联的sql字符串中的参数值会发生什么?
伊恩(Ian)

58

一个更容易理解和更一般的答案是这样的:

想象一下动态SQL查询:

sqlQuery='SELECT * FROM custTable WHERE User=' + Username + ' AND Pass=' + password

一个简单的SQL注入就是将Username输入为 ' OR 1=1--

这将有效地使SQL查询:

sqlQuery='SELECT * FROM custTable WHERE User='' OR 1=1-- ' AND PASS=' + password

这表示选择所有用户名为空('')或1=1布尔值(等于true)的客户。然后,它--用于注释掉其余的查询。因此,这将打印出整个客户表,或者使您能够使用它进行任何操作。

现在,参数化查询的方式有所不同,例如:

sqlQuery='SELECT * FROM custTable WHERE User=? AND Pass=?' parameters.add("User", username) parameters.add("Pass", password)

其中用户名和密码是指向关联的输入的用户名和密码的变量。

现在,您可能会认为,这根本不会改变任何东西。当然,您仍然可以将诸如Nobody OR 1 = 1'-之类的内容输入用户名字段,从而有效地进行查询:

sqlQuery='SELECT * FROM custTable WHERE User=Nobody OR 1=1'-- AND Pass=?'

这似乎是一个有效的论点。但是,你会错的。

参数化查询的工作方式是,将SQL查询作为查询发送,并且数据库确切知道此查询将执行的操作,然后才将用户名和密码仅作为值插入。这意味着它们不能影响查询,因为数据库已经知道查询将执行的操作。因此,在这种情况下,它将查找用户名Nobody OR 1=1'--和空密码,该用户名应为false。

不过,这并不是一个完整的解决方案,因此仍然需要进行输入验证,因为这不会影响其他问题,例如 攻击,因为您仍然可以将javascript放入数据库中。然后,如果将其读出到页面上,则将根据任何输出验证将其显示为普通javascript。因此,实际上最好的办法仍然是使用输入验证,但是使用参数化查询或存储过程来停止任何SQL攻击。

资料来源:http//www.lavamunky.com/2011/11/why-parameterized-queries-stop-sql.html


10

“诸如SqlParameterCollection之类的参数集合提供类型检查和长度验证。如果使用参数集合,则将输入视为文字值,而SQL Server则不将其视为可执行代码。使用参数集合的另一个好处是,您可以可以执行类型和长度检查。超出范围的值会触发异常。这是深度防御的一个很好的例子。”

http://msdn.microsoft.com/en-us/library/ff648339.aspx


5

当使用参数化查询时,攻击面会减少到与参数混在一起。

请使用SqlParameters,但不要忘记上溢,下溢和未经验证的参数。例如,如果方法为“ proc buy_book (@price money”,则恶意攻击者将试图诱使应用程序以@price设置为运行0.01,或者试图通过提交导致溢出的操作来使应用程序执行有趣的操作。Sql溢出通常不会引起人们的兴趣(即它们只会导致异常,因此您不太可能写入相邻内存)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.