asp.net – 参数是否真的足以防止Sql注入?

我一直在向我的同事和这里讨论在SQL查询中使用参数的好处,特别是在.NET应用程序中。我甚至已经远远地承诺他们作为免疫SQL注入攻击。

但我开始怀疑这是否真的是真的。有没有任何已知的SQL注入攻击将是成功的参数化查询?你能例如发送一个字符串导致服务器上的缓冲区溢出吗?

当然还有其他考虑要做,以确保一个Web应用程序是安全的(如清理用户输入和所有东西),但现在我正在考虑SQL注入。我特别感兴趣的是对MsSQL 2005和2008的攻击,因为它们是我的主数据库,但所有数据库都很有趣。

编辑:澄清我的意思是通过参数和参数化查询。通过使用参数,我的意思是使用“变量”,而不是在字符串中构建sql查询。
所以,而不是这样做:

SELECT * FROM Table WHERE Name = 'a name'

我们这样做:

SELECT * FROM Table WHERE Name = @Name

然后在query / command对象上设置@Name参数的值。

占位符足以防止注射。你可能仍然打开缓冲区溢出,但这是一个完全不同的攻击从SQL注入(攻击矢量将不是SQL语法,但二进制)。由于传递的参数都将被正确转义,因此攻击者没有任何方式传递将被视为“活”SQL的数据。

您不能使用占位符内的函数,并且不能将占位符用作列或表名,因为它们作为字符串文字转义和引用。

但是,如果您在动态查询中使用参数作为字符串连接的一部分,则您仍然容易注入,因为您的字符串不会被转义,而是字面值。使用其他类型的参数(如整数)是安全的。

也就是说,如果你使用使用输入来设置像security_level这样的值,那么有人可以在你的系统中创建自己的管理员,并拥有一个免费的。但这只是基本的输入验证,并且与SQL注入无关。

http://stackoverflow.com/questions/306668/are-parameters-really-enough-to-prevent-sql-injections

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:asp.net – 参数是否真的足以防止Sql注入?