我正在使用一个使用Statement的MySQL包装器方法,我想将其更改为PreparedStatement以增强安全性,遗憾的是,此方法要求允许任意SQL作为参数,例如“WHERE id = 5”
我可以用PreparedStatement以某种方式允许这个吗?
如果没有,您能否提出另一种方法可以清理数据库输入以防止SQL注入?
由于
编辑:抱歉,不清楚,整个“WHERE id = 5”位每次都可以更改,而不仅仅是5。
答案 0 :(得分: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”)......你就麻烦了。
答案 1 :(得分:0)
提供一些问号:
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
答案 2 :(得分:0)
"WHERE id=?";
preparedStatementInstantce.setInt(id);
答案 3 :(得分:0)
当您使用PreparedStatement时,您将使用问号
替换您的注射值WHERE id=?
然后,您可以使用PreparedStatement对象上的setter来插入它们。
pstmt.setInt(1, 5);
答案 4 :(得分:0)
你也可以按照
的方式编写准备好的陈述WHERE (id = ? OR false = ? ) AND (name = ? OR false = ?) --etc
并把假=?当你得到相应的参数时,标志为true