三谈 CSRF 攻击应对之道

551 阅读1分钟
原文链接: zhoupq.com

在 MVC.xml 配置文件中为某些请求配置了拦截器,拦截之后生成 CSRFToken 或 验证。如果某个操作仅仅是一个js事件,而不是请求呢?这样的事件无法被拦截。此时,采用 Ajax,它可以主动发起请求。

拦截器无法拦截

有一个登录功能,点击“登录”按钮后,我们能看到在原页面上弹出登录窗口,URL 没有变化。内部的逻辑是,在点击按钮后,前台利用该按钮的id属性,通过 jQuery选择器 触发了点击事件,调用了 $.webox() 方法,在此方法中加载了登录窗口的页面。我们发现,一整套流程下来,完全没有与后台发生交互。既然不能被拦截器拦截,那么何不主动出击,向服务器索要一个 CSRFToken 呢?

Ajax 主动发起请求

很容易地想到了 Ajax。首先在后台编写一个请求类,与拦截生成 CSRFToken 的拦截器功能相似,但是概念和写法不同,一个是拦截器,一个是请求。该请求命名为 SaveCSRFTokenController”,参照其他 Controller 的写法,并在配置文件中注册。

简要代码

服务端

  • SaveCSRFTokenController.java

    String CSRFToken = CSRFTokenManager.getTokenForSession(request.getSession());
    try
    {
        PrintWriter out = response.getWriter();
        out.println(CSRFToken);
        out.flush();
        out.close();
    } catch (IOException e)
    {
        e.printStackTrace();
    }

    客户端

  • csrf.js

    var url_CSRFToken = "..../SaveCSRFToken/saveCSRFToken.tag?num="+new Date();
    $.ajax({
        url: url_CSRFToken,
        success: function(data){
        $(".loginForm input[name='CSRFToken']").val(data);
      }
    });
  • csrf.html

    
    
    

详细代码

CSRF攻击防御——Ajax请求