SQL 注入就是通過(guò)把SQL命令插入到Web表單遞交或輸入域名或頁(yè)面請(qǐng)求的查詢(xún)字符串,最終達(dá)到欺騙服務(wù)器執(zhí)行惡意的SQL命令。
在使用JAVA ORM時(shí)基本不用擔(dān)心防范SQL injection,而在使用JDBCtemplate時(shí),由于用到了sql命令,所以可能會(huì)注意對(duì)Sql注入得防范。
下面以sql語(yǔ)句
select * from table_name where id = 1 OR 1=1
為例進(jìn)行分析。
Demo1
@RequestMapping(method = RequestMethod.GET)
public @ResponseBody
List<Customer> getCustomerByid(@RequestParam String id) {
return jdbcTemplate.query(
"SELECT * FROM customers WHERE ?",
new CustomerMapper(),id);
}
在postman中進(jìn)行實(shí)驗(yàn)
可以看到JDBCtemplate對(duì)參數(shù)化sql查詢(xún)進(jìn)行了驗(yàn)證,從而防范了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中進(jìn)行實(shí)驗(yàn)
Paste_Image.png
在這種直接拼接sql語(yǔ)句的情況下,發(fā)生了sql入侵。
總結(jié)
JDBCtemplate中對(duì)參數(shù)化的sql查詢(xún)有著良好的驗(yàn)證機(jī)制,因此建議使用參數(shù)化SQL的方式。