为了账号安全,请及时绑定邮箱和手机立即绑定

使用准备语句的可变列名

使用准备语句的可变列名

子衿沉夜 2019-07-04 17:49:20
使用准备语句的可变列名我想知道是否存在使用准备好的语句指定返回的列名。我正在使用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注入漏洞。
查看完整描述

3 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

这表明DB设计错误。用户不需要知道列名。创建一个包含这些“列名”的真正DB列,并将数据存储在其中。

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

如果您想继续这个方向,您需要清理列名并自己连接/构建SQL字符串。引用单独的列名并使用String#replace()若要在列名中转义相同的引号,请执行以下操作。


查看完整回答
反对 回复 2019-07-04
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

我认为这种情况不能工作,因为准备好的语句的全部目的是防止用户输入未转义的查询位,所以您总是会引用或转义文本。

如果要安全地影响查询结构,则需要使用Java对此输入进行清理。


查看完整回答
反对 回复 2019-07-04
?
弑天下

TA贡献1818条经验 获得超8个赞

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

}


查看完整回答
反对 回复 2019-07-04
  • 3 回答
  • 0 关注
  • 440 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号