JDBCtemplate防范Sql注入攻击

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中进行实验


Paste_Image.png

在这种直接拼接sql语句的情况下,发生了sql入侵。

总结

JDBCtemplate中对参数化的sql查询有着良好的验证机制,因此建议使用参数化SQL的方式。

推荐阅读更多精彩内容