1

我正在为我的 Tomcat 服务器应用程序编写 Java 中的 DAO 层,

我希望使用 Prepared Statement 包装我的查询(1. 解析查询一次,2. 防御 SQL 注入),我的数据库设计包含每个数据源系统的 MyISAM 表。通过 DBO 进行的大多数查询都是使用不同的表名作为参数的选择。

其中一些表可能是动态创建的。

我已经阅读了许多解释我可能不会使用表名作为 Prepared 语句的参数的帖子。

我找到了建议使用某种类型的函数(例如 mysql_real_escape_string)的解决方案,这些函数可以处理这个参数并将结果作为字符串附加到查询中,

是否有任何内置的 Jave 库函数可以以最佳优化的方式完成,或者您可能建议在 DAO 层中执行其他操作(我不喜欢将任何例程添加到它自己的数据库中)?

4

2 回答 2

4

您可以对表名应用限制吗?这可能比引用更容易。例如,如果您可以说所有表名都必须匹配正则表达式,[0-9A-Za-z_]+那么我认为您不需要任何引用。如果你需要空格,你可能总是使用`table name`- 但同样,不用担心“完整”引用。

限制可用的东西通常比处理所有可能性要简单得多:)

于 2012-07-25T07:35:48.027 回答
1

如果您想更加安全,可以准备查询并使用提供的表名调用它以检查它是否确实存在:

PreparedStatement ps = conn.prepareStatement("SHOW TABLES WHERE tables = ?");
ps.setString(1, nameToCheck);
if(!ps.executeQuery().next())
  throw new RuntimeException("Illegal table name: " + nameToCheck);

(这种WHERE情况可能需要一些修正,因为我现在手头没有 mysql)。

于 2012-07-25T10:16:36.967 回答