gpt4 book ai didi

java - Java 中的PreparedStatement,带有数据库和列名变量

转载 作者:行者123 更新时间:2023-12-01 21:14:30 27 4
gpt4 key购买 nike

我正在使用 PreparedStatement 在 SQL 中编写一些代码来帮助 SQL 注入(inject)。

示例:

stm = c.prepareStatement("UPDATE "
+ listResults.get(i).get(TemplateFile.TYPEOFPLAY).toLowerCase()
+ " SET score=? WHERE player_name_fkey=? AND school_name_fkey=? AND tournament_number=?;");

stm.setInt(1, Utilities.readNumber(listResults.get(i).get(TemplateFile.TOURNAMENT + j - 1)));
stm.setString(2, listResults.get(i).get(TemplateFile.NAME));
stm.setString(3, listResults.get(i).get(TemplateFile.SCHOOL_NAME));
stm.setInt(4, j);

我的问题如下:有没有办法让PreparedStatement对象允许参数(?符号)用于数据库名称和列。例如:

stm = c.prepareStatement("UPDATE ? SET score=? WHERE player_name_fkey=? AND school_name_fkey=? AND tournament_number=?;");

stm.setString(1, listResults.get(i).get(TemplateFile.TYPEOFPLAY).toLowerCase());
stm.setInt(2, Utilities.readNumber(listResults.get(i).get(TemplateFile.TOURNAMENT + j - 1)));
stm.setString(3, listResults.get(i).get(TemplateFile.NAME));
stm.setString(4, listResults.get(i).get(TemplateFile.SCHOOL_NAME));
stm.setInt(5, j);

它看起来会好得多,也更容易阅读。

预先感谢您的帮助!

最佳答案

你不能那样做。您只能在PreparedStatement 上绑定(bind)列值。如果您没有从最终用户那里获得表名称,您可以执行以下操作

String query = "UPDATE <tablename> SET score=? WHERE player_name_fkey=? AND school_name_fkey=? AND tournament_number=?";
query.replace("<tablename>", listResults.get(i).get(TemplateFile.TYPEOFPLAY).toLowerCase())
c.prepareStatement(query);

如果您从最终用户处获取表名称,则拥有表名称白名单并使用白名单检查您的输入

关于java - Java 中的PreparedStatement,带有数据库和列名变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40513718/

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