哪一个更安全的SQL注入-NamedParameterJdbcTemplate或SimpleJdbcTemplate?

时间:2016-08-11 10:49:43

标签: java spring sql-injection spring-jdbc jdbctemplate

哪一个对SQL注入是安全的:NamedParameterJdbcTemplate还是SimpleJdbcTemplate?

例如,

String sql = "insert into db_table (associateid,comment) values(:associateId,:comments)";
Map<String, Object> paramMap = new HashMap<String, Object>();
paramMap.put("associateId", "12345");
paramMap.put("comments", "some comments");
int rowNumber = readTemplate.update(sql, paramMap);

String sql = "insert into db_table (associateid,comment) values(?,?)";
int rowNumber = readTemplate.update(sql,new Object[] {"comments","some comments"} );

第一个使用NamedParameterJdbcTemplate,而第二个使用SimpleJdbcTemplate。 在某些网站中,它的给定与两者相同,在其他一些网站中,NamedParameterJdbcTemplate是安全的。 任何人都可以清楚我的怀疑吗?

2 个答案:

答案 0 :(得分:4)

两者都使用Preparedstatement来执行查询。这些是防止SQL注入的东西。因此,SQL注入没有区别。

但是,如果您查看SimpleJdbcTemplate的文档:

  

已过时。
  自春季3.1起   支持JdbcTemplate和NamedParameterJdbcTemplate。 JdbcTemplate和NamedParameterJdbcTemplate现在提供了SimpleJdbcTemplate的所有功能。

所以你应该使用NamedParameterJdbcTemplate,因为它没有被删除。 (遗留代码可能仍然使用它)

答案 1 :(得分:3)

我认为没有区别,因为它们都与SQL注入保护无关。它是在底层驱动程序 PreparedStatement 中实现的。

例如,您可以查看 com.mysql.jdbc.PreparedStatement #setString()