程序员|程序员应知应会之越权问题

程序员|程序员应知应会之越权问题


对于很多应用系统来说 , 由于开发周期或者是程序员水平的问题 , 会出现越权问题 。
越权问题分为两类:横向越权和纵向越权 。
横向越权指得是获取了同级别用户的权限:例如A登陆自己的商城 , 却能够看到B的订单 。
纵向越权是指获取了更高级别用户的权限:例如普通用户A获取了管理员用户B的权限 。

【程序员|程序员应知应会之越权问题】横向越权产生的一个原因 , 是只做了认证 , 却没有做鉴权 。 例如:国内某知名国企系统 , 以手机号作为登陆名 。 当登陆认证通过时 , 查询个人信息 , 会把手机号和token一起post给后台 , 后台查看token正确之后 , 会执行select * from infomation where id = 手机号 。 如果此时 , 用浏览器自带的调试功能 , 对该请求编辑并重发时 , 将手机号换成别人的 , 即可返回其它人信息 。 而理论上手机号的范围只在10000000000到19999999999之间 , 所以利用该漏洞 , 可以获取所有人员包括工资、身份证号码、个人住址等隐私信息 。
对于这种横向越权问题 , 可以将token做鉴权 , 即将token与登陆名绑定 , 这样用户就无法访问到其它用户的信息了 。
纵向越权最常见的场景是 , 对于高级别权限的url没有做鉴权 , 而只是简单地对普通用户隐藏了起来 。 例如当用户登陆时 , 后台会判断用户角色 , 然后返回角色对应的菜单 , 例如普通用户有三个菜单 , 而管理员用户有五个 。 但是只是没有把管理员用户多余的两个菜单返回给普通用户而已 。 如果普通用户猜出了管理员用户专用的url , 直接在浏览器中输入 , 则可以进入管理员菜单 。
对于这种纵向越权问题 , 解决方法也很简单 , 只需要将session与用户角色强绑定 , 并且在每个url进入时都进行验证就行了 。
总结起来 , 越权问题并不可怕 , 产生的原因通常都是开发周期或程序员责任心的问题 。 在数据安全越来越重要的今天 , 保护用户隐私益发被重视 。 但是依然还是有很多单位的系统存在安全问题 。 足以让听者落泪 , 闻者足戒 。