一尘不染

参数真的足以阻止Sql注入吗?

sql

我一直在向同事和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参数的值。


阅读 183

收藏
2021-05-05

共1个答案

一尘不染

占位符
足以防止注入。您可能仍然对缓冲区溢出持开放态度,但这是与SQL注入完全不同的攻击方式(攻击向量不是SQL语法,而是二进制)。由于传递的所有参数都将被正确地转义,因此攻击者无法以任何方式传递将被视为“实时”
SQL的数据。

您不能在占位符内使用函数,也不能将占位符用作列名或表名,因为它们被转义并用字符串文字形式引用。

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

就是说,如果您使用use输入来设置诸如的值security_level,那么某人可以使自己成为系统中的管理员,并拥有免费的服务。但这只是基本的输入验证,与SQL注入无关。

2021-05-05