繁体   English   中英

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

[英]Variable column names using prepared statements

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

我正在使用 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 注入漏洞。

这表明数据库设计不佳。 用户不需要知道列名。 创建一个真正的 DB 列来保存这些“列名”并沿它存储数据。

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

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

准备一个允许列名的白名单。 使用“查询”在白名单中查找以查看列名是否存在。 如果不是,则拒绝查询。

接受的答案实际上并不正确。 虽然 OP 方法表明数据库设计不好,但业务逻辑可能需要它(例如 MySQL IDE)

无论如何,对于 MySQL 准备好的语句,您需要知道的是? 用于值,但如果您需要转义列名、表名等,请使用?? 反而。

像这样的事情会起作用:

SELECT ??, ??, ?? FROM ?? WHERE ?? < ? 

将值设置为['id', 'name', 'address', 'user', 'id', 100]

我认为这种情况是行不通的,因为准备好的语句的重点是防止用户输入未转义的查询位 - 所以你总是要引用或转义文本。

如果您想安全地影响查询结构,您需要在 Java 中清理此输入。

使用语句接口的 sql 注入劣势作为优势。 前任:

st=conn.createStatement();
String columnName="name";
rs=st.executeQuery("select "+ columnName+" from ad_org ");
public void MethodName(String strFieldName1, String strFieldName2, String strTableName)
{
//Code to connect with database
String strSQLQuery=String.format("select %s, %s from %s", strFieldName, strFieldName2, strTableName);
st=conn.createStatement();
rs=st.executeQuery(strSQLQuery);
//rest code
}

下面是java中的解决方案。

String strSelectString = String.format("select %s, %s from %s", strFieldName, strFieldName2, strTableName);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM