Oracle 数据库中的 Java 是否支持参数化预准备语句以安全地执行 TRUNCATE TABLE 语句?

问题描述 投票:0回答:1

我正在尝试使用 Java 和 Oracle 数据库截断表。我的目标是实现这一目标,同时避免 SQL 注入漏洞。这是我尝试过的代码:

String tableName = "employee";
String truncateQuery = "TRUNCATE TABLE ?";
try (PreparedStatement statement = connection.prepareStatement(truncateQuery)) {
    statement.setString(1, tableName);
    statement.executeUpdate();
}

但是,当我执行这段代码时,我遇到了“无效的表名”错误。我知道将表名直接连接到查询字符串(“TRUNCATE TABLE”+ tableName)可能会导致命令注入漏洞。

我还确认了表名是有效的,因为直接在数据库中执行“TRUNCATE TABLE employee”工作正常。

我的问题是:在这种情况下,有没有一种方法可以有效地使用查询参数,以避免在 Oracle 数据库中使用 Java 中的准备语句截断表时发生 SQL 注入?

我感谢任何关于如何安全地实现这一目标的指导或建议。

java oracle jdbc ojdbc
1个回答
0
投票

我不懂Java。但是,由于涉及 Oracle 数据库,如果您可以使用存储过程,您可以将表名传递给它,并让过程 truncate table 作为参数传递。

类似这样的:

SQL> create or replace procedure p_trunc (par_table_name in varchar2) is
  2  begin
  3    execute immediate 'truncate table ' || dbms_assert.sql_object_name (par_table_name);
  4  end;
  5  /

Procedure created.

测试:

SQL> select * from test;

        ID
----------
         1
         2
         3

SQL> exec p_trunc('test');

PL/SQL procedure successfully completed.

SQL> select * from test;

no rows selected

SQL>

dbms_assert.sql_object_name

验证输入参数字符串是现有 SQL 对象的合格 SQL 标识符

这意味着它将防止您担心的 SQL 注入。


如果您接受这个建议,剩下的就是找出如何从 Java 程序中调用存储过程;我无法提供帮助。

© www.soinside.com 2019 - 2024. All rights reserved.