如何解决纵向越权问题,附代码

2024-01-31 23:28

本文主要是介绍如何解决纵向越权问题,附代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

正文

测试过程详述

低高权限两个用户中菜单栏中销量上报功能栏下不同功能,用低权限Token替换掉高权限Token,低权限可访问高权限的功能列表,同样回显出高权限的回显数据

风险分析

由于后台应用没有做权限控制,或仅仅在菜单、按钮上做了权限控制,导致恶意用户只要猜测其他管理页面的URL或者敏感的参数信息,就可以访问或控制其他角色拥有的数据或页面,达到权限提升的目的。

解决思路

1、使用redis,key=sessionId,value=token
2、用户登录时,将信息存到缓存中
3、当用户请求接口时,在网关获取到sessionId,再根据传入的token去对比缓存的token。如果一致,就放行;如果不一致,就报错:不可越权,请求未授权
4、用户登出时,清出sessionId的缓存

代码

网关的代码

public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();HttpHeaders headers = request.getHeaders();String path = exchange.getRequest().getURI().getPath();if (isSkip(path)) {return chain.filter(exchange);}if (Objects.nonNull(authProperties.getSkipAuth()) && authProperties.getSkipAuth()) {return chain.filter(exchange);}ServerHttpResponse resp = exchange.getResponse();String headerToken = exchange.getRequest().getHeaders().getFirst(AuthProvider.AUTH_KEY);String paramToken = exchange.getRequest().getQueryParams().getFirst(AuthProvider.AUTH_KEY);if (StringUtils.isBlank(headerToken) && StringUtils.isBlank(paramToken)) {return unAuth(resp, "缺失令牌,鉴权失败");}String auth = StringUtils.isBlank(headerToken) ? paramToken : headerToken;String token = JwtUtil.getToken(auth);Claims claims = JwtUtil.parseJWT(token);if (claims == null) {return unAuth(resp, "请求未授权");}//是否开启纵向越权if (authProperties.getIsUltraVires()) {Mono<Void> resp1 = isUltraVires(headers, resp, token);if (resp1 != null) return resp1;}return chain.filter(exchange);}
private Mono<Void> isUltraVires(HttpHeaders headers, ServerHttpResponse resp, String token) {String cookie = headers.getFirst(TokenConstant.COOKIE);if(ObjectUtil.isEmpty(cookie)){return unAuth(resp, "不可越权,请求未授权");}String sessionId =cookie.replace("JSESSIONID=","").trim();RedisUtil redisUtil = SpringUtil.getBean(RedisUtil.class);String sessionKey = StringUtil.format(CacheNames.SESSION_KEY,sessionId);String redisToken = (String)redisUtil.get(sessionKey);if(ObjectUtil.isEmpty(redisToken)){return unAuth(resp, "不可越权,请求未授权");}if(!token.equals(redisToken)){return unAuth(resp, "不可越权,请求未授权");}return null;}

登陆器的代码

登录时:

/*** 用于越权校验* @param request* @param authInfo*/private void setSessionRedis(HttpServletRequest request, AuthInfo authInfo) {String accessToken = authInfo.getAccessToken();String sessionId = request.getSession().getId();String sessionKey = StringUtil.format(CacheNames.SESSION_KEY,sessionId);redisUtil.set(sessionKey,accessToken);}

登出时:

@GetMapping("/login/out")@ApiOperation(value = "退出登录", notes = "退出登录")public R loginOut() {HttpServletRequest request = WebUtil.getRequest();String sessionId = request.getSession().getId();String sessionKey = StringUtil.format(CacheNames.SESSION_KEY,sessionId);redisUtil.del(sessionKey);return R.success();}

这篇关于如何解决纵向越权问题,附代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/665387

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

C#使用HttpClient进行Post请求出现超时问题的解决及优化

《C#使用HttpClient进行Post请求出现超时问题的解决及优化》最近我的控制台程序发现有时候总是出现请求超时等问题,通常好几分钟最多只有3-4个请求,在使用apipost发现并发10个5分钟也... 目录优化结论单例HttpClient连接池耗尽和并发并发异步最终优化后优化结论我直接上优化结论吧,

Java内存泄漏问题的排查、优化与最佳实践

《Java内存泄漏问题的排查、优化与最佳实践》在Java开发中,内存泄漏是一个常见且令人头疼的问题,内存泄漏指的是程序在运行过程中,已经不再使用的对象没有被及时释放,从而导致内存占用不断增加,最终... 目录引言1. 什么是内存泄漏?常见的内存泄漏情况2. 如何排查 Java 中的内存泄漏?2.1 使用 J

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码

《在MyBatis的XML映射文件中<trim>元素所有场景下的完整使用示例代码》在MyBatis的XML映射文件中,trim元素用于动态添加SQL语句的一部分,处理前缀、后缀及多余的逗号或连接符,示... 在MyBATis的XML映射文件中,<trim>元素用于动态地添加SQL语句的一部分,例如SET或W

numpy求解线性代数相关问题

《numpy求解线性代数相关问题》本文主要介绍了numpy求解线性代数相关问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 在numpy中有numpy.array类型和numpy.mat类型,前者是数组类型,后者是矩阵类型。数组

解决systemctl reload nginx重启Nginx服务报错:Job for nginx.service invalid问题

《解决systemctlreloadnginx重启Nginx服务报错:Jobfornginx.serviceinvalid问题》文章描述了通过`systemctlstatusnginx.se... 目录systemctl reload nginx重启Nginx服务报错:Job for nginx.javas

使用C#代码计算数学表达式实例

《使用C#代码计算数学表达式实例》这段文字主要讲述了如何使用C#语言来计算数学表达式,该程序通过使用Dictionary保存变量,定义了运算符优先级,并实现了EvaluateExpression方法来... 目录C#代码计算数学表达式该方法很长,因此我将分段描述下面的代码片段显示了下一步以下代码显示该方法如

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

Mysql DATETIME 毫秒坑的解决

《MysqlDATETIME毫秒坑的解决》本文主要介绍了MysqlDATETIME毫秒坑的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 今天写代码突发一个诡异的 bug,代码逻辑大概如下。1. 新增退款单记录boolean save = s