越权
越权是非常严重的安全漏洞,通常状态是开发人员对请求的限制逻辑不严格导致的。
如果系统中有角色的概念,越权可能出现不同角色间的越权和同角色间的越权。
相同角色:
A用户,B用户是相同的角色。
A用户和B用户都可以调用 /photo/{id}。
这个url,如果在后端不判断这个phtoto的id属于那个用户的,就很容易造成越权,这里只要A用户登录验证通过后,就可以用这个api,换id来请求到B用户的照片信息,这种情况下通常在后端要把id和用户id都当成查询条件,去库中查询,这样就能有效防止越权。
其实就是加了一层过滤,是谁的数据。如果数据归属权有层级,交叉,那将是更复杂的控制,不过这些都是业务逻辑决定的。
[HttpGet("/photo/{id}")]
public IActionResult GetPohot(int id)
{
//数据集全
var photos = new List<dynamic>
{
new {ID=1, Name="第一张",User="A"},
new {ID=2, Name="第二张",User="B"},
new {ID=3, Name="第三张",User="A"},
new {ID=4, Name="第四张",User="B"}
};
//越权
//return new JsonResult(photos.SingleOrDefault(s => s.ID == id));
//增加数据所属条件
return new JsonResult(photos.SingleOrDefault(s => s.ID == id && s.User == User.Identity.Name));
}
有时,我们很容易忽略一些数据所有权,比较上传的文件,图片,属于那个用户,可能在表里对文件,图片和用户作了绑定,但当前端访问或下载这个文件,图片时,并没有去对文件,图片所有权作个判断,从而造成越权风险。
不同角色:
A角色,B角色有不同的功能
很多时候,不同的角色有不同的功能,这些功能是通过菜单在UI上显示,当不同的角登录后,只能看见属于自己的功能,如果不在服务端对每个api和角色加以映射判断(api层的权限设定很重要),就很容易造成越权,虽然A角色在UI上看不到B角色的功能菜单,一但A记下B角角功能的url,也会很顺利的访问到B角色的功能。
还有一个就是权限控制模块的处理,如果多个角色都有不同的权限控制权限,一定要设置好权限的范围控制,权限低的不能添加或修改成权限高的用户,负责后果很严重,老板很生气。