主页 > 网络知识 > 越权漏洞之测试与修复(2)

越权漏洞之测试与修复(2)

从session中提取userid后,就要查询与之对应的角色id

//UserId为用户id,RoleId为角色ID,通过UserId获取roleidpublic static int GetRoleId(int UserId) { Connection conn = Connect();PreparedStatement st = null;ResultSet rs = null; int RoleId = 0; try { // 查询接口访问的角色id,roleid为权限表里的角色ID字段,apiname为权限表里的API接口名称IDString sql = "select roleid from usertable where userid = ?";st = conn.prepareStatement(sql);// 这里使用PreparedStatementst.setInt(1, UserId);rs = st.executeQuery(); if(rs.next()){ RoleId = rs.getInt("roleid"); return RoleId;} } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("查询失败!");} return RoleId;}

校验垂直越权时,判断当前用户是否对指定的接口有访问权限,U_RoleId为用户名对应的角色id,A_RoleId为Api接口对应的角色id,Api_Name为用户尝试访问的API接口名称(这里在系统架构评审,安全设计阶段,就要检查数据库的权限表设置时,Api接口是否有指定对应的角色id)

public static boolean CheckUpPrivilege(int UserId, String Api_Name) { Connection conn = Connect();PreparedStatement st = null;ResultSet rs = null; int U_RoleId = GetRoleId(UserId); int A_RoleId = 0; try { String sql = "select roleid from user_role where apiname = ?";st = conn.prepareStatement(sql);// 这里使用PreparedStatementst.setString(1, Api_Name);// 执行sql命令roleid和Role_Id,判断用户是否有权限访问对应的接口地址rs = st.executeQuery(); if(rs.next()) { A_RoleId = rs.getInt("roleid");// 通过比较,当用户角色id大于等于接口指定的角色id是,可以访问,部分特定接口只有指定的角色才能访问,可直接限定if (U_RoleId >= A_RoleId) { return true;} else { return false;} } } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("查询失败!");} return false;}

最后再判断一下是否是水平越权,S_UserId为当前登录用户的userid,P_UserId为目标对象对应的userid,比如对订单信息进行操作时,可以先通过订单号提取与之对应的userid,再进行判断(当然,订单表,在系统架构评审,安全设计阶段,就要检查订单号是否有指定对应的用户id)。

public static boolean CheckLevelPrivilege(int S_UserId, int P_UserId) { if(S_UserId == P_UserId){ return true;} else{ return false;} } 四、最后

类似订单号这种参数,生成时要无规律可循,可以通过hash算法进行加密;或者请求的数据包额外附带一个参数,比如token,从而防止重放和遍历订单号这类攻击(篡改订单号)。

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!