参考:
1 mass管理:不安全的绑定器
比如说有一个类,类中有很多个属性:性别,姓名,身份证号,准考证号,通过控制属性的公开与否,使得攻击者无法将任意值绑定到属性,例如更改身份证号。
MVC模型
Spring MVC 基于 MVC 模式,因此理解 Spring MVC 需要先对 MVC 模式有所了解。
MVC是 model、view、和controller的缩写,是软件开发中一种常用的架构模式。
MVC各部分根据职责进行分离,使程序的结构更为直观,增加了程序的可扩展性、可维护性、可复用性。
可以用如下的图形来表示MVC三者之间的关系:
-
模型(Model)
模型封装了数据及对数据的操作,可以直接对数据库进行访问,不依赖视图和控制器,也就是说模型并不关注数据如何展示,只负责提供数据。GUI 程序模型中数据的变化一般会通过观察者模式通知视图,而在 web 中则不会这样。
-
视图(View)
视图从模型中拉取数据,只负责展示,没有具体的程序逻辑。
-
控制器(Controller)
控制器用于控制程序的流程,将模型中的数据展示到视图中。
把view和controller控制分开,要控制哪些可以直接请求,哪些不行。
修复方案
所以,针对这种漏洞,可以分为两个方向考虑:
-
使用SpringMVC框架:控制
-
老代码改不动:则暂时搁置。
2 访问控制:数据库
用户应该对他们需要的数据具有适当的访问权,既不能多也不能少(即用户不能对过多的数据具有访问权)。
访问控制:需要给用户提供他们所需的访问权,且仅提供他们所需的访问权。
例如,考试查询成绩,如果只需要输入准考证号,就可以查询到用户成绩,那么把准考证号改几位数,便可以遍历所有用户的成绩,那么就产生了越权风险,所有用户的信息都泄露了。
而如果,加入一个查询条件,例如性别,姓名呢?也不行。性别就两个选项,遍历无非就是多遍历一个选项,也就是翻一倍而已,与一个id没有本质区别。姓名查询,如果是熟人,同班同学,那么也会导致很容易泄露。
那么添加什么条件比较好呢?例如身份证号,或者其他不容易猜到的信息,这种东西一般大家没那么容易记住,或者说遍历,那么就会相对安全一点。
程序未做恰当的验证,类似于数据库越权。如果用户只需要输入id就可以进行查询,那么就可能存在越权查询的情况。
修复方案
所以,针对这种漏洞,可以分为两个方向考虑:
- 非用户输入类查询:程序内部控制,那么没有被越权的风险。
- 用户输入类查询:
- 用户只需要输入一个查询条件,便可获取信息,那么需要添加多种限定条件进行限制。
- 用户输入多种条件,但是多种条件也较容易被猜到,那么与A情况无异。
- 用户输入多种条件,并且多种条件不容易被猜到,那么经过代码审核,具体判断后,可以视为无风险。