java - Statement.executeQuery() 和 SQL 注入(inject)

标签 java mysql hibernate jdbc sql-injection

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

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

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

最佳答案

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

如果您的 Statement 查询不带任何参数,则客户端无法注入(inject)恶意 SQL 例程。每当您有参数化查询时,您应该改用 PreparedStatement

至于语句限制,您应该让DBA 为您提供一个数据库用户帐户,该帐户只能在应用程序架构上执行SELECT 和DML 语句。不应为应用程序用户帐户授予 DROP 和 TRUNCATE 权限。

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

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

关于java - Statement.executeQuery() 和 SQL 注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31017584/

相关文章:

mysql - 使用 Rails ActiveRecord 抽象进行此查询的最佳方法是什么?

java - sessionfactory中的Hibernate连接管理

java - 从 CompletableFuture 获取回复

mysql - 无法在 MySQL 中将字符串转换为时间

php - 水平回显表格php

java - hibernate java.lang.NoClassDefFoundError

hibernate - QueryDsl orderBy 列名

java - 在 Ruby 中加密的字符串给出 : 'BadPaddingException' when decrypted in Java

java - 将 Camera2 放入 fragment 中

java - 使用带有泛型的 Jackson ObjectMapper 到 POJO 而不是 LinkedHashMap