Statement.executeQuery()和SQL注入

时间:2015-06-24 04:24:19

标签: java mysql hibernate jdbc sql-injection

我们有基于内部网络的工具,允许对数据库进行任意SQL查询。访问该工具是有限的。与有意篡改数据或攻击的人相比,我更担心错误或事故。

查询最终由Statement.executeQuery执行,并返回结果。我尝试了几次测试运行,看起来像executeQuery,正如文档建议的那样,在select之外的任何其他调用上都失败了。

是否有任何其他SQL语句/组合可以欺骗executeQuery调用以引发数据库中的更改(插入/更新/删除/删除等)。我在网上尝试了几个SQL注入示例,并且在每种情况下都失败了。

1 个答案:

答案 0 :(得分:1)

当查询参数连接到查询模板时,SQL注入攻击是可能的,因此允许恶意攻击者注入恶意代码。

如果您的class DummyRoute(object): name = 'one_of_my_routes' request.matched_route = DummyRoute() 查询不接受任何参数,则客户端无法注入恶意SQL例程。只要您有参数化查询,就应该使用Statement代替。

对于语句限制,您应该让DBA为您提供一个数据库用户帐户,该帐户只能在应用程序模式上执行SELECT和DML语句。不应该允许DROP和TRUNCATE权限进入应用程序用户帐户。

如果使用动态架构升级(例如FleywayDB),则可以为该特定情况使用单独的数据库帐户和单独的DataSource。

这样,您还可以保护您免受应用程序开发人员错误导致的数据损坏。