我正在try 使用Java和Oracle数据库截断一个表.我的目标是在避免SQL注入漏洞的同时实现这一点.以下是我try 过的代码:

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

然而,当我执行这段代码时,我遇到了一个"无效的表名"错误.我知道将表名直接连接到查询字符串("truncate table"+ableName)可能会导致命令注入漏洞.

我还确认了表名是有效的,因为在数据库中直接执行"truncate table Employee"可以很好地工作.

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

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

推荐答案

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

不,你不能那样做.正如 comments 者所说,不能将SQL表名(或列名、表达式等)参数化为PreparedStatment.只有值可以参数化为参数.

AFAIK,对于所有其他数据库产品的JDBC驱动程序也是如此.

如何避免SQL注入和截断表?

您可以完全避免生成SQL字符串,并预先填充(比方说)Map以将用户提供的表名转换 for each (已知)表的TRUNCATE条语句,这对用户截断是安全的.

或者,您可以创建一个"可安全截断"的表列表,并根据该列表验证用户提供的表名...然后为TRUNCATE生成SQL.

或者,您可以确保用户不能提供表名.


底线是,将SQL表名参数化为PreparedStatement只会给您带来一种错误的安全感.坏人仍然可以通过传递一个shouldn't被截断的表名来造成混乱.

Java相关问答推荐

伪类focus-in不适用于PFA中的选项卡

基于仅存在于父级中的字段查询子文档?

BiPredicate和如何使用它

无法找到符号错误—Java—封装

使用动态ID从json获取详细信息的Jolt规范

上下文初始化期间遇到异常-使用Java配置配置HibernateTemplate Bean时

如何以干净的方式访问深度嵌套的对象S属性?

Hibernate 6支持Joda DateTime吗?

';com.itextpdf.ext.html.WebColors已弃用

Spark忽略Iceberg Nessie目录

使用UTC时区将startDatetime转换为本地时间

Spring-Boot Kafka应用程序到GraalVM本机映像-找不到org.apache.kafka.streams.processor.internals.DefaultKafkaClientSupplier

Regex以查找不包含捕获组的行

Spring Boot中的应用程序.properties文件中未使用的属性

从映射列表中检索所有键

使IntelliJ在导入时优先 Select 一个类或将另一个标记为错误

如何使用Java ZoneID的区域设置?

HBox内部的左对齐按钮(如果重要的话,在页码内)

这是JavaFX SceneBuilder的错误吗?

Cucumber中第二个网页的类对象未初始化