java 权限url权限_filter设计缺陷导致的权限绕过

  • 1.1 权限控制的本质

一般来说,为了防止越权操作,通常会结合filter进⾏相关接⼝的鉴权操作。其中不不外乎就是对每⼀个接口(通俗来说就是我们的URI/URL)进行业务梳理,然后判断当前URI/URL是否具有相应的业务权限。

  • 1.2 常见权限控制的实现

一般情况下,通常是获取到当前URI/URL,然后跟需要鉴权的接口进行⽐对,或者直接结合startsWith()或者endsWith()方法,设置对应的校验名单。

例如下⾯的过滤器实现,以/login开头的不需要校验(登陆业务每个人都可以访问),所有.do/.action结尾的接⼝均需要做登陆检查,防止未授权访问等。

String uri = request.getRequestURI();if(uri.endsWith(".do")||uri.endsWith(".action")) {
    //检测当前用户是否登陆User user =(User) request.getSession().getAttribute("user");if(user==null|| "".equals(user)) {
    errorResponse(response, paramN, "未授权访问");return;}}

但是,在Java中获取当前request中的URI/URL通常会使用request.getRequestURL()和request.getRequestURI()这两个方法,但是如果没有进⾏相关的处理的话,有可能导致权限控制绕过的风险。

  • 1.3 绕过方式

当权限过滤器获取当前request中的URI/URL使用request.getRequestURL()和request.getRequestURI()这两个方法时,可以考虑以下三种⽅式进行权限绕过:

  • 1.3.1 非标准化绕过

  • 相关场景:

例如/system/login开头的接口是白名单,不需要进行访问控制(登陆页面所有人都可以访问),其他接⼝都需要进⾏登陆检查,防止未授权访问:

String uri = request.getRequestURI();if(uri.startsWith("/system/login")) {
    //登陆接口设置⽩白名单filterChain.doFilter(request, response);}else if(uri.endsWith(".do")||uri.endsWith(".action")) {
    //检测当前⽤户是否登陆User user =(User) request.getSession().getAttribute("user");if(user==null|| "".equals(user)) {
    errorResponse(response, paramN, "未授权访问");return;}}
  • 相关效果如下:

当未登录直接访问UserInfoSearch.do接口时,显示未授权访问:

99b4c2d9e022231b88c3f5cd87033d00.png

  • 相关原理:

中间件在进⾏解析时,会对我们URI中的../进行相关处理从⽽得到相关的servlet。也就是说尝试对我们访问的URL引入..

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以先实现一个简单的Filter,用来校验用户的登录状态和权限,具体的实现步骤如下:1. 实现一个Filter类,实现Filter接口,覆盖doFilter方法,在方法中实现用户登录校验和权限校验的逻辑。2. 配置web.xml文件,配置Filter和要校验的URL,同时配置Filter的初始参数,如登录页面URL等。3. 创建一个Filter实例,并将其配置到web.xml文件中,完成Filter的配置。4. 启动服务器,Filter就会根据web.xml文件中的配置,实现用户登录校验和权限校验的功能。 ### 回答2: 用户登录校验和权限校验是Web应用开发中非常常见的功能之一。在Java Web应用中,可以使用原生Java编写Filter来实现这个功能。 FilterJava Servlet规范提供的一种组件,可以对请求进行拦截和处理。下面是一个用原生Java编写的登录校验和权限校验的Filter的示例: 首先,需要创建一个类来实现Filter接口,并重写其doFilter方法,该方法将在每一个请求被执行时被调用。在doFilter方法中,我们可以对请求进行相关的校验和处理。 ```java public class AuthenticationFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; // 进行用户登录校验 boolean isLoggedIn = checkUserLoggedIn(httpRequest); if (!isLoggedIn) { httpResponse.sendRedirect("/login"); // 未登录则跳转到登录页面 return; } // 进行权限校验 boolean hasPermission = checkUserPermission(httpRequest); if (!hasPermission) { httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied"); // 没有权限则返回403错误 return; } chain.doFilter(request, response); // 放行请求 } // 校验用户是否已登录 private boolean checkUserLoggedIn(HttpServletRequest request) { // 实现具体的登录校验逻辑,比如判断Session中是否存在登录信息 // 返回一个boolean值表示是否已登录 } // 校验用户是否有权限访问资源 private boolean checkUserPermission(HttpServletRequest request) { // 实现具体的权限校验逻辑,比如判断用户角色是否具备访问权限 // 返回一个boolean值表示是否有权限 } } ``` 然后,在web.xml文件中配置该Filter,指定需要被该Filter拦截的URL模式: ```xml <filter> <filter-name>AuthenticationFilter</filter-name> <filter-class>com.example.AuthenticationFilter</filter-class> </filter> <filter-mapping> <filter-name>AuthenticationFilter</filter-name> <url-pattern>/*</url-pattern> // 拦截所有URL </filter-mapping> ``` 以上代码是一个简单的示例,实际应用中可能需要根据具体需求进行一些调整和优化。这个Filter可以在用户每次请求时拦截并进行用户登录校验和权限校验,从而实现这两个功能的自动化处理。 ### 回答3: 要用原生Java写一个Filter实现用户登录校验和权限校验,可以按照以下步骤进行实现: 1. 创建一个Java类,命名为LoginFilter,实现javax.servlet.Filter接口。 2. 在LoginFilter类中,实现doFilter方法,该方法接收三个参数:ServletRequest request, ServletResponse response, FilterChain chain。此方法会在每次请求前后被调用。 3. 在doFilter方法中,首先获取用户的登录信息,可以通过从request对象中获取session或者cookie等方式来获取。 4. 如果用户没有登录信息,则将请求重定向到登录页面,或者返回相应的错误提示,用于告知用户需要先登录才能访问页面。 5. 如果用户已经登录,则进一步校验用户的权限。可以通过获取用户的角色或者拥有的权限列表来进行校验。 6. 如果用户没有足够的权限,则同样将请求重定向到相应的错误页面,或者返回相应的错误提示。 7. 如果用户通过了登录和权限的校验,可以通过调用chain.doFilter(request, response)方法,继续执行其他Filter或者Servlet。 8. 最后,需要将LoginFilter类配置在web.xml文件中,以便让容器在每个请求过程中都能调用该过滤器。 通过以上步骤,我们就可以通过原生Java写一个Filter来实现用户登录校验和权限校验。当用户请求一个需要登录和权限的页面时,该Filter会进行相应的校验,并根据校验结果决定是否允许用户访问页面。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值