gpt4 book ai didi

java - 如何在不使用准备好的语句的情况下清理 SQL

转载 作者:太空狗 更新时间:2023-10-29 22:54:39 25 4
gpt4 key购买 nike

对于某些sql语句我不能使用准备好的语句,例如:

SELECT MAX(AGE) FROM ?

例如,当我想改变表格时。有没有在 Java 中清理 sql 的实用程序? ruby 中有一个。

最佳答案

是的,准备好的语句查询参数只能在您使用单个文字值的地方使用。您不能将参数用于表名、列名、值列表或任何其他 SQL 语法。

因此您必须将您的应用程序变量插入到 SQL 字符串中并适本地引用该字符串。请使用引号 来分隔您的表名标识符,并通过加倍来转义引号字符串:

java.sql.DatabaseMetaData md = conn.getMetaData();
String q = md.getIdentifierQuoteString();
String sql = "SELECT MAX(AGE) FROM %s%s%s";
sql = String.format(sql, q, tablename.replaceAll(q, q+q), q);

例如,如果您的表名字面上是 table"name,而您的 RDBMS 标识符引用字符是 ",那么 sql 应该包含像这样的字符串:

SELECT MAX(AGE) FROM "table""name"

我也同意@ChssPly76 的评论——最好是您的用户输入实际上不是文字表名,而是您的代码映射到表名的符号,然后您将其插入到 SQL 查询中。这让您更加确信不会发生 SQL 注入(inject)。

HashMap h = new HashMap<String,String>();
/* user-friendly table name maps to actual, ugly table name */
h.put("accounts", "tbl_accounts123");

userTablename = ... /* user input */
if (h.containsKey(userTablename)) {
tablename = h.get(userTablename);
} else {
throw ... /* Exception that user input is invalid */
}
String sql = "SELECT MAX(AGE) FROM %s";
/* we know the table names are safe because we wrote them */
sql = String.format(sql, tablename);

关于java - 如何在不使用准备好的语句的情况下清理 SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1677465/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com