使用预准备语句的变量列名

2022-08-31 20:37:53

我想知道是否有任何方法可以使用预准备语句指定返回的列名称。

我正在使用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'

我知道我不能对表名执行此操作,正如这里所讨论的那样,但是我想知道是否有一些方法可以对列名执行此操作。

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


答案 1

这表明数据库设计不正确。用户不需要知道列名称。创建一个保存这些“列名称”的真实数据库列,并沿其存储数据。

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

如果要继续朝着这个方向前进,则需要清理列名(以避免SQL注入)并自己连接/构建SQL字符串。引用单独的列名,并使用 String#replace() 对列名内的相同引号进行转义。


答案 2

准备允许列名称的白名单。使用“查询”在白名单中查找,以查看列名称是否存在。如果没有,请拒绝查询。


推荐