Java 语句.executeQuery()和SQL注入

Java 语句.executeQuery()和SQL注入,java,mysql,hibernate,jdbc,sql-injection,Java,Mysql,Hibernate,Jdbc,Sql Injection,我们有一个基于web的内部工具,允许对数据库进行任意SQL查询。访问该工具的权限受到限制。比起有人故意篡改数据或攻击,我更担心错误或事故 查询最终由Statement.executeQuery执行,并返回结果。我尝试了几次测试运行,正如文档所示,executeQuery似乎在除select之外的任何其他调用上都失败了 是否有任何其他SQL语句/组合可以欺骗executeQuery调用以反映数据库中的更改(插入/更新/删除/删除等)。我尝试了一些web上可用的SQL注入示例,但每次都失败了。当查询

我们有一个基于web的内部工具,允许对数据库进行任意SQL查询。访问该工具的权限受到限制。比起有人故意篡改数据或攻击,我更担心错误或事故

查询最终由Statement.executeQuery执行,并返回结果。我尝试了几次测试运行,正如文档所示,executeQuery似乎在除select之外的任何其他调用上都失败了


是否有任何其他SQL语句/组合可以欺骗executeQuery调用以反映数据库中的更改(插入/更新/删除/删除等)。我尝试了一些web上可用的SQL注入示例,但每次都失败了。

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

如果您的
语句
查询没有任何参数,则客户端无法注入恶意SQL例程。无论何时进行参数化查询,都应该使用
PreparedStatement

至于语句限制,您应该让DBA为您提供一个数据库用户帐户,该帐户只能在应用程序架构上执行SELECT和DML语句。应用程序用户帐户不允许具有删除和截断权限

如果您使用动态模式升级(例如FleywayDB),您可以针对特定情况使用单独的数据库帐户和单独的数据源


这样,您还可以防止由于应用程序开发人员的错误而导致的数据损坏。

我不知道有任何损坏,但您可以通过与对数据库没有任何写访问权限的用户连接来确保不会发生这种情况。如果您可以构造一个执行更新并返回某些内容的查询(例如
INSERT…返回
或某个数据库支持的程序代码块),则
executeQuery
不会保护您。还要注意的是,如果查询未生成结果集,某些JDBC驱动程序在执行查询后会给您一个错误。另一方面,如果允许用户执行任意查询,则您不需要SQL注入来执行恶意代码。DBA必须提供有限的权限,以便unt提交给应用程序开发人员,一旦部署应用程序,数据源将只使用特定的DB用户凭据。从这一点来看,应用程序客户端无法切换数据库用户。这是事实,但只需假设
executeQuery
本身将保护您(如问题所示)这是不够的。
PreparedStatement
提供SQL注入保护,而不是普通的
语句
。参数验证在将查询命令发送到数据库服务器之前起作用。但是如果用户可以执行任意查询(这是问题的主题),它将不会保护您。