SQL注入的非程序化预防

时间:2011-02-12 05:46:30

标签: security sql-injection

我同意正确的输入验证是防止SQL注入的唯一“万无一失”的方法,但它需要修改现有应用程序中的大量代码,可能需要重新构造设计糟糕的应用程序。

在防止SQL注入的自动化机制方面有很多学术兴趣(不会在这里列出它们,我已经完成了一项文献调查,至少看过20次),但我还没有看到任何东西。实际上已经实施了。

有没有人知道在学术环境之外使用实际的任何框架,基于签名,基于异常还是其他?

修改:我正在寻找修改代码库的内容。

4 个答案:

答案 0 :(得分:8)

我工作的公司使用Barracuda Web Application Firewall来处理您所说的内容。从我所看到的它运作得相当好。基本上,如果它检测到可疑输入,它会将用户重定向到我们选择的页面。这允许您在Internet和应用程序之间放置一个图层,并且不需要您更改任何代码。

也就是说,不保护您的应用程序是一个坏主意。

答案 1 :(得分:3)

如果您不打算修改代码,那么您只能拦截请求。由于没有好的或坏的SQL命令,你的选项非常有限,但你可以尝试拒绝从单个字符串开始的多个查询。换句话说:

<强>法律

SELECT * FROM foo WHERE bar='baz';

非法

SELECT * FROM foo WHERE bar=''; DELETE * FROM foo; SELECT 'baz';

由于几乎每次注入攻击都需要在一个请求中进行多次查询,并且如果您的应用程序不需要此功能,您可能只是逃避这一点。它可能不会捕获每种类型的攻击(使用subquerys和函数可能会造成很多伤害),但它可能比什么都没有好。

答案 2 :(得分:1)

在修补SQL注入等漏洞时,保持代码不变的唯一方法是使用像开源项目mod_security这样的Web应用程序防火墙。最近Oracle发布了一个database firewall来过滤讨厌的查询。这种方法更好地解决了SQL注入的问题,但它可以解决所有问题。

如果你不相信它,那么WAF是非常有用和免费的put it to the test

WAF只是一层。您还应该test the application *。这是一种深度防御方法。

*这是我提供的限量免费服务。

答案 3 :(得分:1)

Java中PreparedStatements的默认行为,您传入每个参数使其大部分都是万无一失的,因为框架会为您转义输入。这并不妨碍你做像

这样的事情

exec spDoStuff&lt; var&gt;

spDoStuff在哪里:

exec(&lt; var&gt;)

但是如果你使用普通查询,它会非常有效。我不知道你是否认为它是非程序性的,但开发人员不必编写代码来自行管理输入验证。

像这样:

int id;
String desc;
Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement("SELECT * FROM table1 t1 WHERE t1.id = ? AND t2.description = ?");
// or conn.prepareStatement("EXEC spMyProcedure ?, ?");
ps.setInt(1, id);
ps.setString(2, desc);
ResultSet rs = ps.executeQuery();
...
rs.close();
ps.close();
conn.close();