我一直在向同事和SO讲这两种方法,以讲究在SQL查询(尤其是.NET应用程序)中使用参数的好处。我什至甚至承诺它们可以抵抗SQL注入攻击。
但是我开始怀疑这是否真的是真的。是否存在可以对参数化查询成功进行的已知SQL注入攻击?例如,您是否可以发送导致服务器上的缓冲区溢出的字符串?
当然,要确保Web应用程序是安全的,还需要考虑其他因素(例如清理用户输入和所有其他内容),但是现在我正在考虑SQL注入。我对MsSQL 2005和2008的攻击特别感兴趣,因为它们是我的主要数据库,但是所有数据库都很有趣。
编辑:澄清我的意思是参数和参数化的查询。通过使用参数,我的意思是使用“变量”而不是在字符串中构建sql查询。 因此,不要这样做:
SELECT * FROM Table WHERE Name = 'a name'
我们这样做:
SELECT * FROM Table WHERE Name = @Name
然后在查询/命令对象上设置@Name参数的值。
占位符 足以防止注入。您可能仍然对缓冲区溢出持开放态度,但这是与SQL注入完全不同的攻击方式(攻击向量不是SQL语法,而是二进制)。由于传递的所有参数都将被正确地转义,因此攻击者无法以任何方式传递将被视为“实时” SQL的数据。
您不能在占位符内使用函数,也不能将占位符用作列名或表名,因为它们被转义并用字符串文字形式引用。
但是,如果您在动态查询中将 参数 用作 字符串连接的 一部分,则您仍然容易受到注入的影响,因为您的字符串不会被转义,而是文字形式的。使用其他类型的参数(例如整数)是安全的。
就是说,如果您使用use输入来设置诸如的值security_level,那么某人可以使自己成为系统中的管理员,并拥有免费的服务。但这只是基本的输入验证,与SQL注入无关。
security_level