Jfinal 的一个漏洞,或注入

Controller里的 getModel方法

新手容易在Controller里 直接User user=getModel();

然后 user.save();

这个时候如果html那边 被恶意改了一些属性并且post提交就相对比较危险

比如 如果有个money字段, 用户可以新增一个<input name="money" value="999999">

这个时候会被getModel();强行转化并且save



----------------------------------------------------------

我已将getModel()改造为:

/**直接根据input获得Model */

public <T extends Model<?>> T getModel(T model,String fields) {

for(String field:fields.split(",")){

model.set(field,getPara(field));

}

return model;

}


在Controller中可以这样用

User u=getModel(new User(),"name,pass");

u.save();//新增

或者

User u=enhance(XXXXService.class).findById("idvalue");//查询一个user

u=getModel(u,"name,pass");//只更新name和pass字段

u.update();//提交到db

评论区

JFinal

2016-12-01 18:15

这件事情的学名叫:mass assignment,是任何框架都存在的事情,即便你用Spring、struts开发,或者用 ruby 语言的 rails框架开发也一样要处理这件事,开发者自己需要处理好,因为web 框架处于后端,在框架层面无法预测你前端页面传过来的哪些字段是需要的,这种“哪些字段是需要的”逻辑属于业务层面的事情

jfinal 在很早期的版本就已提供了极简支持:
1:model.keep(...) 可以在 getModel 以后,指定只保留几个属性,可以一次指定多个,如:model.keep("title", "content")
2:model.remove(...) 也可以移除指定的属性

对于这个问题的探讨,几年前就有了:http://www.oschina.net/question/260040_46570

光光哥

2016-12-02 13:50

@JFinal 好的谢谢, 还有上个问题freemaker 404 和 500的问题。不知如何解决

JFinal

2016-12-02 14:36

@光光哥 单步调试一下,看程序具体的走向,很可能是某个拦截器中有 try catch 之类的吃掉了异常

热门反馈

扫码入社