将字符串插入PreparedStatement

时间:2011-05-11 17:41:59

标签: java mysql security sql-injection

我正在使用一个使用Statement的MySQL包装器方法,我想将其更改为PreparedStatement以增强安全性,遗憾的是,此方法要求允许任意SQL作为参数,例如“WHERE id = 5”

我可以用PreparedStatement以某种方式允许这个吗?

如果没有,您能否提出另一种方法可以清理数据库输入以防止SQL注入?

由于

编辑:抱歉,不清楚,整个“WHERE id = 5”位每次都可以更改,而不仅仅是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