我正在使用Statement的一個包裝器方法來使用MySQL,我想將其更改爲PreparedStatement以增強安全性,不幸的是,此方法要求允許任意SQL作爲參數,例如「WHERE ID = 5" 。將字符串插入到PreparedStatement
我可以用PreparedStatement以某種方式允許這個嗎?
如果不是,你能否提出另一種方法來清理數據庫輸入以防止SQL注入?
感謝
編輯: 對不起,那是不明確的,整個「WHERE ID = 5」位多變每一次,而不僅僅是5
我正在使用Statement的一個包裝器方法來使用MySQL,我想將其更改爲PreparedStatement以增強安全性,不幸的是,此方法要求允許任意SQL作爲參數,例如「WHERE ID = 5" 。將字符串插入到PreparedStatement
我可以用PreparedStatement以某種方式允許這個嗎?
如果不是,你能否提出另一種方法來清理數據庫輸入以防止SQL注入?
感謝
編輯: 對不起,那是不明確的,整個「WHERE ID = 5」位多變每一次,而不僅僅是5
如果你的意思是你是否可以做動態的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」本身)......你有麻煩了。
提供它的一些問號:
PreparedStatement s = new PreparedStatement("SELECT X FROM Y WHERE ID = ?");
s.setString(1, "123456");
s.execute();
// ...
此處瞭解詳情:http://download.oracle.com/javase/tutorial/jdbc/basics/prepared.html
是的,你會把followi NG:
"WHERE id=?";
preparedStatementInstantce.setInt(id);
當你使用PreparedStatement,你會用問號
WHERE id=?
更換您的注入值,則可以使用PreparedStatement對象的制定者將其插入。
pstmt.setInt(1, 5);
您還可以沿着
WHERE (id = ? OR false = ?) AND (name = ? OR false = ?) --etc
行準備好的聲明,並把假=?標誌爲true,當你得到相應的參數去它
「任意SQL」指的是「5」還是指向完整的WHERE碎片? – leonbloy 2011-05-11 17:47:34
@leonbloy完整的WHERE片段,編輯原來的帖子來說明清楚。 – Reu 2011-05-11 17:49:10