SQL 注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
在使用JAVA ORM时基本不用担心防范SQL injection,而在使用JDBCtemplate时,由于用到了sql命令,所以可能会注意对Sql注入得防范。
下面以sql语句
select * from table_name where id = 1 OR 1=1
为例进行分析。
Demo1
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody
List<Customer> getCustomerByid(@RequestParam String id) {
return jdbcTemplate.query(
"SELECT * FROM customers WHERE ?",
new CustomerMapper(),id);
}
在postman中进行实验
可以看到JDBCtemplate对参数化sql查询进行了验证,从而防范了sql注入。
Demo2
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody
List<Customer> getCustomerByid(@RequestParam String id) {
String sql = "SELECT * FROM customers WHERE +id";
return jdbcTemplate.query(sql, new CustomerMapper());
}
在postman中进行实验
在这种直接拼接sql语句的情况下,发生了sql入侵。
总结
JDBCtemplate中对参数化的sql查询有着良好的验证机制,因此建议使用参数化SQL的方式。