2018-10-23 23:47
@alotuser 具体怎么做呢? 能否在贴子里头补充点示例性的代码?
我在直觉上感觉这个没法处理,因为 setter 方法也是要用于正当功能需求的,如果过滤的话,也就影响正当功能了
2018-10-23 21:06
@alotuser 源头不好杜绝,假定你的 account 这张表有个字段叫 money,然后你的 Model 通常也会有 setMoney(int) 方法,这个 setMoney(int) 在正常使用情况下用于合理的需求,例如更新 money 值的时候
但为了合理需求而创建的 setMoney(...) 方法也会被非法利用,恶意用户可以人为制造带有 money 字段的 post 请求,客户端的这个恶意操作是无法消除掉的
2018-10-23 19:49
再补充一下, jfinal 的 Model 中还预备了一个回调方法叫 public void filter(...),只要你的 model 中覆盖掉这个方法,就会被回调,如果希望有更高的安全性,避免其他开发者没有使用 Model.keep(...) 从而造成问题,还可以像下面这样来做:
public class User extends Model {
protected void filter(int filterBy) {
// 这里使用 keep 或者 remove 过滤掉一些不希望被操作的对象
// 在需要对这些字段进行操作时,使用别的方式来做,例如Db.save()
}
}
2018-10-23 19:43
@alotuser 这个问题在 6 年半以前就有人提到过,但对方提出来的时候 jfinal 就已经有提供 API 来快捷解决问题, 6 年半以前的贴子在这里:
https://www.oschina.net/question/260040_46570
这个问题学名叫:mass assignment, 楼主能看到这个现象证明极其细心,在 IT 这行很有发展潜力啊
简单说,在 getModel(...) 以后,通过 Model.keep(....) 即可指定哪些字段是保留的,哪些是要删除的,例如更新用户信息时如果用到了 User ,那么:
getModel(User.class).keep("nickName", "email").update();
就只会更新指定的字段
无论恶意用户如何在表单中制造新的字段都不可能形成威胁。 这个问题其实对传统的 web 框架也有同样的问题,除非为接收表单单独做一个只存在部分字段的 setter 方法,否则那些没在表单中的字段也可以被注入