亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用準備語句的可變列名

使用準備語句的可變列名

子衿沉夜 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 關注
  • 464 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號