jfinal多条件查询的时候怎么防止sql注入

public void list() {

//条件查询

        StringBuffer sb = new StringBuffer();

        if (!isParaBlank("order_number")){  //订单号

            String value = DesUtil.stripTags(getPara("order_number"));

            sb.append(" and a.order_number like '%"+value+"%'");

        }

        if(!isParaBlank("status")){ // 0待提交样品/1取消订单/2已分配/3订单已经完成

          String value = DesUtil.stripTags(getPara("status"));

            sb.append(" and status = '"+value+"'");

        }

        if(!isParaBlank("equipment_id")){ // 仪器

         String value = DesUtil.stripTags(getPara("equipment_id"));

           sb.append(" and b.equipment_id = '"+value+"'");

       }

        if(!isParaBlank("custom_name")){ //送检人

          String value = DesUtil.stripTags(getPara("custom_name"));

          sb.append(" and a.custom_name like '%"+value+"%'");

        }

        if(!isParaBlank("start_time")){ //预约时间

         String value = DesUtil.stripTags(getPara("start_time"));

         sb.append(" and apponintment_time >= '"+value+"'");           

        }

        if(!isParaBlank("end_time")){ //预约时间

         String value = DesUtil.stripTags(getPara("end_time"));

         sb.append(" and apponintment_time <= dateadd(second,-1,dateadd(day,1,'"+value+"'))");    

        }

        if(!isParaBlank("start_time1")){ //期望完成时间

         String value = DesUtil.stripTags(getPara("start_time1"));

         sb.append(" and expected_time >= '"+value+"'");           

        }

        if(!isParaBlank("end_time1")){ //期望完成时间

         String value = DesUtil.stripTags(getPara("end_time1"));

         sb.append(" and expected_time <= dateadd(second,-1,dateadd(day,1,'"+value+"'))");    

        }

    

Page<Orders> page = ordersService.paginate3(getParaToInt("page"), getParaToInt("limit"),sb);//

我这是一个条件查询的分页 怎么改下代码防止sql注入


评论区

受伤的蚂蚁

2018-12-11 10:08

使用占位符的优点:
1.增加SQL代码可读性
2.占位符可以预先编译,提高执行效率
3.防止SQL注入
4.用占位符的目的是绑定变量,这样可以减少数据SQL的硬解析,所以执行效率会提高不少

1. 查询参数无通配符
String userId = getPara("userId");
User.dao.find("select * from t_er_user where userId = ?", userId);

2. 参数有通配符
String userName = this.getPara("userName");
Object [] para = new Object[]{"%" + userName + "%"};
User.dao.find("select * from t_er_user where userName like ?", para);

3. 多个参数,其中有参数需要添加通配符
String userId = this.getPara("userId");
String userName = this.getPara("userName");
Object [] para = new Object[]{userId, "%" + userName + "%"};
User.dao.find("select * from t_er_user where userId = ? and userName like ?", para);

happyboy

2018-12-21 09:17

使用jfianl自带的数据库模板功能可以很方便的处理动态查询,把sql写在模板文件里,你这样写太繁琐了。

JFinal

2018-12-22 12:49

jfinal 所有数据库 API 操作都使用的 PreparedStatement,天然防 sql 注入

如果还不放心,可以结合 DruidPlugin ,这个插件再加了层 sql 注入的防护

最后,确保万无一失, sql 中的参数不要用字符串拼接,而是用问号占位符

最方便方法是使用 jfinal 的 sql 管理功能:
https://www.jfinal.com/doc/5-13

年轻似水

2018-12-29 11:35

@受伤的蚂蚁 User.dao.find("select * from t_er_user where userId = ? and userName like ?", para); 我需要活的 看我代码sb参数 是根据用户选择的条件

年轻似水

2018-12-29 11:35

@happyboy 能不能发个动态的sql我看下 谢谢

受伤的蚂蚁

2019-01-02 08:56

@年轻似水 你这个跟业务需求有关,上边的写法都是用的PreparedStatement,只要是这种写法就可以,灵活应用,比如你这个需求可以加个变量,一个存储sql,一个存储Object [] para,具体参考第三条;再一个思路,可以用下jfinal的sql管理功能,具体见文档 https://www.jfinal.com/doc/5-13

热门反馈

扫码入社