纵向越权
纵向越权,也称为垂直越权,是指不同级别或不同层次的用户、系统或组件之间,未经授权地访问或操作更高级别或更低级别的资源或数据。这通常涉及到权限的升级或降级使用。
示例:
在一个学校管理系统中,老师可以审批班级学生的请假申请。学生可以为自己提交请假申请,这时老师的权限大于学生的权限。
如果某位学生使用自己的账号审批了请假申请,那么便发生了纵向越权。
横向越权
横向越权,也称为水平越权,是指同一级别或同一层次的用户、系统或组件之间,未经授权地访问或操作其他用户、系统或组件的资源或数据。简单来说,就是同一层级的不同用户之间互相访问了对方没有权限访问的数据或资源。
示例:
在一个学校管理系统中,老师可以审批班级学生的请假申请。学生可以为自己提交请假申请,这时学生之间的权限相同,但只能为自己提交申请。
如果某位学生使用自己的账号为其他学生提交了请假申请,那么便发生了横向越权。
为什么会发送越权
对于学生来说,我登录自己的账户,明明只能看见提交申请的入口,根本没有审批的入口,怎么会发生越权了。
通常,一个Web系统由前端(展示层)和后端(数据处理层)组成。前端只能控制用户看见什么,确不能控制用户针对某个接口发起请求,尤其现在前后端分离的大环境下,后端api相对之前更容易暴露在人们的视野中。所有稍微了解下,都可以做到对api发起攻击。于是,学生便可以轻易的对审批接口发起请求。
对于后端,所有来自外部的请求都要做校验,这些校验不局限于越权,常见的sql注入,xss,xml注入等等都需要后端对请求进行把关。
比如:我随意对一个api发起调用,前端限制某个参数的长度是36,数据库也是36,那么我输入一个40长度的数据,数据库一定会报错,或者引起其他的异常。
总之一句话,用户身份不可信,用户输入不可信。这是我们做安全防护的基本理念。
越权防护
对于纵向越权来说,我们需要对每个接口划分权限,比如审批接口只能由老师的角色调用,学生不可以调用审批接口,这种一般都可以做公共的配置,来决定每个角色的调用权限。
对于横向越权来说,大部分只能在每个接口中防护,例如申请接口,判断学生身份和要请假的学生是不是同一人,或者不需要请假的学生,谁登录就为谁请假。这些需要日常编码中注意校验。
总结
我们只要记住,前端什么样,后端就什么样。前端某个字段输入36长度,只能是字母数据,后端也要相同的校验。前端不能输入 or (1 = 1),<a href=""/>,后端也不能。前端学生看不到审批,后端也不能操作。这样基本上会解决大部分的安全问题。