博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
web的越权访问的处理(步骤详解)
阅读量:6159 次
发布时间:2019-06-21

本文共 9087 字,大约阅读时间需要 30 分钟。

通知:博客已搬家到CSDN地址为:

https://blog.csdn.net/hdp134793

用户越权访问的处理

一般来说,越权放问就好比你是非系统管理员用户,却偷偷的跑进了系统管理菜单,僭越权利访问里面的信息甚至修改其中的数据(不同级别的越权又称垂直越权访问),因此对数据的安全性造成极大的威胁,是故每家企业都有其方法来保证企业内部数据的安全性,也就是解决越权访问的问题。

有关改业务处理主要考虑下面两个方面:

url的越权访问和接口方法的越权访问

  1. 通过角色用户来判断是否越权访问

分下面几种情况来讨论:

  a.当没有用户登录的时候:

    只允许登录界面和一些js,css等非jsp/html的页面访问,这样算是越权

  b.当用户登录了之后:

    首先通过角色关系去数据库中查找他能够访问的页面,这样的话就可以针对能访问的做一个放行处理,非权限内的页面属于越权,这个时候拦截掉,可以直接让其跳转到登陆界面表示他越权了已经(自行处理越权后的操作)。

  2.具体实现流程

  a.统计好每个菜单url对应的接口方法和子页面访问路径(jsp或html等)

  b.将统计好的数据一一对应起来,存放在配置文件中或者数据库某个表中,这些数据随着业务的新增或者裁剪应有相关对应的维护,暂时以配置文件为例

  c.在登录模块中通过登录的用户角色查找它能够访问的菜单URL(写一个接口方法),存放在一个静态公有list变量中,如下定义:

public static List
MENU_URLS = new ArrayList<>();

将查询返回过来的url集合塞给MENU_URLS

  d,定义一个静态公有Properties变量,用来存放配置文件中的键值对,如下定义:

public static Properties MENU_INTERFACE = null;

然后对其进行读取配置文件并赋值

String url = request.getSession().getServletContext().getRealPath("/WEB-INF/classes/porturl.properties");File file = new File(url);    try {        MENU_INTERFACE = new Properties();        FileInputStream inStream = new FileInputStream(file);        MENU_INTERFACE.load(inStream);        } catch (Exception e) {            System.out.println(e);}

  e.SpringMVC拦截器,判断session中用户是否过期,在doFilter 方法里匹配,只要js,css,pdf,png,jpg等文件可放行,在里面判断用户是否登录,没有登录的话只要是非登录页面的页面,统一视为越权访问。如果是已经登录的用户,我们可以取到登录后的MENU_URLS  MENU_INTERFACE 的信息,可以做如下判断:

如果访问的路径checkURL和MENU_URLS 中的任意子串能匹配的上的话说明是可以访问的,这种情况放行,否则拦截下来跳转登录,记录越权访问信息;

在上面的情况下,还会存在一种情况,当访问的路径是子页面的时候,这个时候需要去匹配,能匹配上的可以放行,这个需要通过checkURL去配置文件中找到对应的父URL,然后再进行匹配MENU_URLS这个里面的父URL是唯一的,配置文件中一(父)对多(子)。

接口访问的也是同样的道理。

其中放行方法:

//正常访问,直接放行filterChain.doFilter(servletRequest, servletResponse);return;//初始化printWriterURLString printWriterURL="";//其他jsp的时候算是越权访问logger.info("用户越权访问!!!!" + url);PrintWriter p = httpResponse.getWriter();p.write(printWriterURL);p.flush();p.close();return;

这样就大功告成,具体代码细节如下所示:

public class SystemFilter implements Filter {    private static Logger logger = Logger.getLogger(SystemFilter.class);    @Override    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)            throws IOException, ServletException {        HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;        HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;        HttpSession session = httpRequest.getSession(true);        String url = httpRequest.getRequestURI();        String printWriterURL = "";        String checkURL = url;        if(checkURL.endsWith("/")){            checkURL = checkURL.substring(0, checkURL.length()-1);            if(checkURL.split("/").length == 2){                PrintWriter p = httpResponse.getWriter();                p.write(printWriterURL);                p.flush();                p.close();                return;            }        }        Object object = session.getAttribute("user");        User user = object == null ? null : (User) object;        boolean isAjaxRequest = false;        if (!StringUtils.isBlank(httpRequest.getHeader("x-requested-with"))                && httpRequest.getHeader("x-requested-with").equals("XMLHttpRequest")) {            isAjaxRequest = true;        }        StringBuffer server = httpRequest.getRequestURL();        if (server.toString().contains(".css") || server.toString().contains(".jsp")                || (server.toString().contains(".js") && !server.toString().contains(".jsp"))                || server.toString().contains(".png") || server.toString().contains(".jpg") || server.toString().contains(".gif") || server.toString().contains(".svg")                || server.toString().contains(".so") || server.toString().contains(".woff")                 || server.toString().contains(".ttf")                 || server.toString().endsWith("/downPDF")         // 下载放行                || server.toString().contains("/websocket")     // 推送放行        ){            if(user ==null && server.toString().contains(".jsp")){                if(server.toString().contains("index.jsp")){                    logger.info("!!!用户未登录且使用index.jsp页面:" + url);                    PrintWriter p = httpResponse.getWriter();                    p.write(printWriterURL);                    p.flush();                    p.close();                    return;                }else if(server.toString().contains("login.jsp")){                    //当访问的是login.jsp的时候放行                    filterChain.doFilter(servletRequest, servletResponse);                    return;                }else{                    //其他jsp的时候算是越权访问                    logger.info("用户越权访问!!!!" + url);                    PrintWriter p = httpResponse.getWriter();                    p.write(printWriterURL);                    p.flush();                    p.close();                    return;                }            }else if(user !=null && server.toString().contains(".jsp") && !(server.toString().contains("login.jsp"))){                Boolean ISURL = false;                //获取访问url的字符串                int urllen = checkURL.split("/").length;                String checkurl = "";                for(int i=2;i
"; }else{ System.out.println("========>"+LoginService.MENU_INTERFACE.get(checkURL.split("/")[2]+"/"+checkURL.split("/")[3])); //正常访问,直接放行 filterChain.doFilter(servletRequest, servletResponse); return; } PrintWriter p = httpResponse.getWriter(); p.write(printWriterURL); p.flush(); p.close(); return; } // 如果发现是css或者js文件,直接放行 filterChain.doFilter(servletRequest, servletResponse); return; } if (!isAjaxRequest) { if (user != null && (server.toString().contains("index.jsp") || server.toString().contains("login.jsp"))) { // 如果发现是css或者js文件,直接放行 filterChain.doFilter(servletRequest, servletResponse); return; } else { if(user != null){ System.out.println("-----------1-----------"+checkURL); if(LoginService.MENU_INTERFACE != null && LoginService.MENU_INTERFACE.size() != 0 && LoginService.MENU_URLS != null && LoginService.MENU_URLS.size() != 0 ){ if(checkURL.split("/").length == 4){ System.out.println("-----------2-----------"+LoginService.MENU_INTERFACE.get(checkURL.split("/")[2]+"/"+checkURL.split("/")[3]));// if(LoginService.MENU_INTERFACE.get(checkURL.split("/")[2]+"/"+checkURL.split("/")[3]) == null){// // 如果发现是css或者js文件,直接放行// filterChain.doFilter(servletRequest, servletResponse);// return;// } Boolean hasIn = false; if(null != LoginService.MENU_INTERFACE.get(checkURL.split("/")[2]+"/"+checkURL.split("/")[3])){ String[] urls = LoginService.MENU_INTERFACE.get(checkURL.split("/")[2]+"/"+checkURL.split("/")[3]).toString().split(","); // jsp/pages/configmgt/device/deviceList.jsp,jsp/pages/configmgt/systemmgt/systemmgtList.jsp a:for(int i=0;i
"; }else{ System.out.println("========>"+LoginService.MENU_INTERFACE.get(checkURL.split("/")[2]+"/"+checkURL.split("/")[3])); //正常访问,直接放行 filterChain.doFilter(servletRequest, servletResponse); return; } } } } PrintWriter p = httpResponse.getWriter(); p.write(printWriterURL); p.flush(); p.close(); return; } } if (url.toString().contains(".jsp")) { logger.info(httpRequest.getSession().getServletContext().getRealPath("/") + "-------"); logger.info("拦截器放行地址:-------------------" + url); } filterChain.doFilter(servletRequest, servletResponse); return; } /** * 判断是否为Ajax请求 * * @param request * HttpServletRequest * @return 是true, 否false */ public static boolean isAjaxRequest(HttpServletRequest request) { return request.getRequestURI().startsWith("/api"); // String requestType = request.getHeader("X-Requested-With"); // return requestType != null && requestType.equals("XMLHttpRequest"); } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { // To change body of implemented methods use File | Settings | File // Templates. }}

 

 

 

 

转载于:https://www.cnblogs.com/b-code/p/9262735.html

你可能感兴趣的文章
Python学习--time
查看>>
在OSCHINA上的第一篇博文,以后好好学习吧
查看>>
Spring常用注解
查看>>
linux:yum和apt-get的区别
查看>>
Sentinel 1.5.0 正式发布,引入 Reactive 支持
查看>>
数据库之MySQL
查看>>
2019/1/15 批量删除数据库相关数据
查看>>
数据类型的一些方法
查看>>
Webpack 2 中一些常见的优化措施
查看>>
移动端响应式
查看>>
js中var、let、const的区别
查看>>
简洁优雅地实现夜间模式
查看>>
react学习总结
查看>>
在soapui上踩过的坑
查看>>
MySQL的字符集和字符编码笔记
查看>>
ntpd同步时间
查看>>
Maven编译时跳过Test
查看>>
Spring Boot 整合Spring Security 和Swagger2 遇到的问题小结
查看>>
Apache通过mod_php5支持PHP
查看>>
java学习:jdbc连接示例
查看>>