跨站点请求伪造解决方案

跨站点请求伪造-CSRF(Cross Site Request Forgery):是一种网络攻击方式。

有很多解决方案:1.验证 HTTP Referer 字段2.在请求地址中添加 token 并验证3.在 HTTP 头中自定义属性并验证.

 

我这里使用了第一种:

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
            FilterChain chain) throws IOException, ServletException {
        

        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpSession session=request.getSession();
        
        //防止跨站点请求伪造,对Referer验证
        
        String referer = request.getHeader("Referer");
        String baseDomain = BaseConfigHolder.getBaseDomain();
        System.out.println("referer:"+referer+"     domain:"+baseDomain);
        if(referer != null && (!(referer.trim().startsWith(baseDomain)))){
            System.out.println("请求伪造,回登录页");
            response.sendRedirect(request.getContextPath()+"/admin/login.jsp");
            return;
        }
        
        
        //session 存在 
        if(session != null && session.getAttribute("user") != null){
            
            chain.doFilter(request, response);
            return;
            
        }
        
         
        if ( ( session ==null || session.getAttribute("user") == null )&& 
                request.getServletPath().endsWith(".jsp") &&
                !request.getServletPath().endsWith("image.jsp") &&
                !request.getServletPath().endsWith("login.jsp")
            ){
            response.sendRedirect(request.getContextPath()+"/admin/login.jsp");
            return;
        }
        /*
        if(request.getServletPath().endsWith("image.jsp") || 
                request.getServletPath().endsWith("login.jsp")){
            chain.doFilter(request, response);
            return;
        }
        */
        
        chain.doFilter(request, response);
    }

 

BaseConfigHolder中加入

    public static String getBaseDomain() {
        String domain = getProperties().getProperty("base.domain");
        ObjectNull();
        if (Utils.isNotEmpty(domain)) {
            return "http:// IP";
        }
        return domain;

    }

     

.properties中加入

base.domain=http://IP/

 

这样可解决
                    

你可能感兴趣的:(web开发)