最近在使用spring 的 jdbctemplate 查询,在 Spring 的 IoC 容器中配置一个 JdbcTemplate 的 bean,将 DataSource 注入进来,然后再把JdbcTemplate 注入到自定义DAO 中。
进入正题,用原生的jdbc就会存在sql拼接问题,拼接的话就自然而然的会出现sql注入漏洞的问题,我们要避免sql注入漏洞,无非就是使用预处理的方式,sql出现注入漏洞的根本原因就是直接拼接参数,所以项目中的sql拒绝拼接sql的参数。
(一):处理多参数的处理方式
直接看例子:
public List getAllOperator(int toPage, int pageSize, String login, String name, String oper_group_id, int state) { String sql = "select p.id, p.login,p.password,p.name,p.email,p.tel,g.name,p.create_time,p.state,p.withdraw_time from oper_person_info as p " + "left join oper_group_info as g on p.oper_group_id = g.id where 1 = 1 "; List
这个例子是随便加的,这里要说的就是最好定义sql的时候使用StringBuffer ,这个比较灵活。
(二):使用like的参数请求方式
public List<OperatorSimple> getAllOperator(int toPage, int pageSize, String login, String name, String oper_group_id, int state) { String sql = "select p.id, p.login,p.password,p.name,p.email,p.tel,g.name,p.create_time,p.state,p.withdraw_time from oper_person_info as p " + "left join oper_group_info as g on p.oper_group_id = g.id where 1 = 1 "; List <Object> queryList=new ArrayList<Object>(); if (!name.equals("")) { sql += " and p.name like ? "; queryList.add("%" + name + "%"); } if (!oper_group_id.equals("")) { sql += " and p.oper_group_id = ? "; queryList.add(oper_group_id); } if (state == 1 || state == 0) { sql += " and p.state = ? "; queryList.add(state); } return super.getJdbcTemplate().query(sql, queryList.toArray(), new OperatorSimpleMapper()); }