我想知道是否仍然可以使用准备好的语句指定返回的列名。

我正在使用MySQL和Java。

当我尝试时:

String columnNames="d,e,f"; //Actually from the user...
String name = "some_table"; //From user...
String query = "SELECT a,b,c,? FROM " + name + " WHERE d=?";//...
stmt = conn.prepareStatement(query);
stmt.setString(1, columnNames);
stmt.setString(2, "x");


我得到了这种类型的语句(在执行之前立即打印)。

SELECT a,b,c,'d,e,f' FROM some_table WHERE d='x'


我希望看到:

SELECT a,b,c,d,e,f FROM some_table WHERE d='x'


我知道我无法针对表名执行此操作,如前所述
here,但想知道是否有某种方法可以对列名进行操作。

如果没有,那么我将只需要尝试确保对输入进行清理,以免导致SQL注入漏洞。

最佳答案

这表明数据库设计不正确。用户不需要知道列名。创建一个实际的DB列,其中包含那些“列名”,并沿其存储数据。

无论如何,不​​能,不能将列名称设置为PreparedStatement值。您只能将列值设置为PreparedStatement

如果您想朝这个方向继续,则需要清理列名(避免使用SQL Injection)并自己串联/构建SQL字符串。引用单独的列名,并使用String#replace()来在列名内转义相同的引号。

关于java - 使用准备好的语句的变量列名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57342624/

10-12 12:41
查看更多