2011-05-11 58 views
0

我正在使用Statement的一個包裝器方法來使用MySQL,我想將其更改爲PreparedStatement以增強安全性,不幸的是,此方法要求允許任意SQL作爲參數,例如「WHERE ID = 5" 。將字符串插入到PreparedStatement

我可以用PreparedStatement以某種方式允許這個嗎?

如果不是,你能否提出另一種方法來清理數據庫輸入以防止SQL注入?

感謝

編輯:  對不起,那是不明確的,整個「WHERE ID = 5」位多變每一次,而不僅僅是5

+1

「任意SQL」指的是「5」還是指向完整的WHERE碎片? – leonbloy 2011-05-11 17:47:34

+0

@leonbloy完整的WHERE片段,編輯原來的帖子來說明清楚。 – Reu 2011-05-11 17:49:10

回答

2

如果你的意思是你是否可以做動態的PreparedStatements,那麼你可以,只要你有控制的替代品。例如(僞代碼):

sql = "SELECT * FROM EMAIL WHERE TYPE = ?"; 
    if(haveId) 
    sql += " AND id=?"; 
    st = createPreparedStatement(sql); 
    st.setString(1,type); 
    if(haveId) 
    st.setString(2,id); 

當然,如果查詢有很多變化,這會變得複雜。例如參見here。 如果你的查詢完全是任意的(如果你的用戶可以輸入「WHERE」本身)......你有麻煩了。

+0

用戶自己不能進入WHERE位,但會有太多的變化可能會按照您的建議進行。 在這種情況下你將如何防範SQL注入? – Reu 2011-05-11 17:56:11

+0

如果它們在WHERE條件中有變化,請參閱我發佈的鏈接。在其他地方,恐怕我需要更多信息。 – leonbloy 2011-05-11 18:14:12

+0

他們通常在哪裏條件,但真的,它可能是任何東西。 – Reu 2011-05-11 18:28:49

0

是的,你會把followi NG:

"WHERE id=?"; 
preparedStatementInstantce.setInt(id); 
0

當你使用PreparedStatement,你會用問號

WHERE id=? 

更換您的注入值,則可以使用PreparedStatement對象的制定者將其插入。

pstmt.setInt(1, 5); 
0

您還可以沿着

WHERE (id = ? OR false = ?) AND (name = ? OR false = ?) --etc 

行準備好的聲明,並把假=?標誌爲true,當你得到相應的參數去它