• java网页程序采用 spring 防止 csrf 攻击 转


    银行项目开发过程中,基本都会采用 spring 框架,所以完全可以不用自己开发 filter 去拦截 csrf 攻击的请求,而直接采用实现 spring 提供的 HandlerInterceptor 来实现。 从本质上来说,这也是一个 filter.  我这里就直接实现它来 防止 csrf 攻击.

    基本思路:
    1. 用户登录之后,后台程序生产一个 csrftoken 的 token ,放在 cookies 中,并且记录在 session 中。
    2. 当客户端发出请求的访问后台程序的时候,经过自己实现的HandlerInterceptor 来拦截.
    3. 拦截的基本方法是检查请求的参数中是否有csrftoken ,并检查这个值,是否合法有效(不为空,并且得到的参数等于cookies 中保存的值,而且还要等于session 中的值,那么就是合法的)

    package com.yihaomen.intercepter;

    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;

    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;

    public class CsrfIntercepter implements HandlerInterceptor {     

    public  static final String CSRFNUMBER = "csrftoken";
        public boolean preHandle(HttpServletRequest request,HttpServletResponse response, Object handler) throws Exception {
        
            String keyFromRequestParam = (String) request.getParameter(CSRFNUMBER);
            String keyFromCookies="";
            boolean result=false;
            Cookie[] cookies = request.getCookies();
            if(cookies!=null){
                for (int i = 0; i < cookies.length; i++) {    
                    String name = cookies[i].getName();
                    if(CSRFNUMBER.equals(name) ) {    
                        keyFromCookies= cookies[i].getValue();    
                    }    
                }
            }
        
            if((keyFromRequestParam!=null && keyFromRequestParam.length()>0 &&
                    keyFromRequestParam.equals(keyFromCookies) &&
                    keyFromRequestParam.equals((String)request.getSession().getAttribute(CSRFNUMBER)))) {
                result=true;
            }else{
                request.getRequestDispatcher("/error/400").forward(request, response);
            }
            
            return result;
        }
        
        public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1,
                Object arg2, Exception arg3) throws Exception {
            
        }
        
        public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
                Object arg2, ModelAndView arg3) throws Exception {
            
        }
    }

  • 相关阅读:
    解决Mac开机变慢 command +option + P + R
    Mac iphone 使用 如何修改apple 用户名 XXX的mac Mac 与iphone如何连接 传递文件 为iphone增加铃声 iphone铃声的制作---城
    Xcode7 iOS9.0 的真机调试
    苹果电脑Mac OS系统重装图文详解
    关闭自动弹出照片自动弹出iTunes以及关闭手机照片流
    mac 使用清除废纸篓或彻底删除某文件 附加: smb afp ftp NAS 访问服务器相关
    辨别苹果数据线真伪 苹果计算器 Dashboard 知识
    使用OC swift 截取路径中的最后的文件名
    升级OS10.11系统后 Xcode6.4的变化少了个按钮 could not launch “Xcode” Xcode 插件安装
    如何在苹果官网下载旧版本的Xcode
  • 原文地址:https://www.cnblogs.com/ailiying/p/7975863.html
Copyright © 2020-2023  润新知