我正在尝试使用 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 数据库,如果您可以使用存储过程,您可以将表名传递给它,并让过程 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 程序中调用存储过程;我无法提供帮助。