网络安全漏洞系列-CSRF漏洞攻防

Posted 美的金融科技

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络安全漏洞系列-CSRF漏洞攻防相关的知识,希望对你有一定的参考价值。

摘要

CSRFCross-site request forgery)跨站请求伪造,也被称为“One Click Attack”或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS不同,XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。

CSRF攻击原理】

下面以网上的一幅图来形象地表述CSRF的攻击原理。

CSRF漏洞危害】

CSRF漏洞是攻击者盗用了你的身份,以你的名义发送恶意的请求,它可以以你的名义发送邮件,发消息,盗取你的账号,甚至于购买商品,虚拟货币转账等等,从而造成你的个人隐私泄露以及财产安全收到威胁。

【防御措施】

     预防CSRF漏洞,我们需要注意以下几个要点:

1、 加入有效性验证Token

   我们保证所有生成的链接都是来自于我们可信域的,通过在生成的链接里加入用户不可控的Token对生成的链接进行校验,可以避免用户生成自己的恶意链接从而被利用。除了有密码、短信验证码、图形验证码校验的功能以外,其他敏感功能都应该加上CSRF防护。类似于图形验证码的方式,在服务端生成随机值,输出到表单的隐藏域中,用户提交请求时再对该值进行校验,以确保请求是由页面正常发起的。如下三步通过加入token来防御CSRF.

  1.1 action生成令牌,保存到session

     String token = TokenProccessor.getInstance().makeToken();//创建令牌   TokenProccessor.java

       /*或者使用SecureRandom生成token

     SecureRandom sr =  SecureRandom.getInstance( "SHA1PRNG" );

     int token = sr.nextInt();//生成32位的整数随机数,还可以进一步对其使用Base64进行编码

        */

        request.getSession().setAttribute("token", token);  //在服务器使用session保存token(令牌)

        request.getRequestDispatcher("/form.jsp").forward(request, response);//跳转到form.jsp页面

 1.2 jsp隐藏域中存储生成的token

       <form action="${path}/servlet/DoFormServlet" method="post">

             <%--使用隐藏域存储生成的token--%>

             <input type="hidden" name="token" value="${token}"/>

            用户名:<input type="text" name="username">

            <input type="submit" value="提交">

       </form>

  1.3 action处理提交表单  

        if(invalidToken(request)){

            response.sendRedirect(errorUrl);

        }else{

           response.sendRedirect(redirectUrl);

        }

/**

* 判断客户端提交上来的令牌和服务器端生成的令牌是否一致

* @param request

* @return

* true 非法token

* false 合法token

*/

private boolean invalidToken(HttpServletRequest request) {

       String client_token = request.getParameter("token");

       //1、如果用户提交的表单数据中没有token,则用户是非法请求

       if(client_token==null){

            return true;

        }

      //取出存储在Session中的token

      String server_token = (String) request.getSession().getAttribute("token");

     //2、如果当前用户的Session中不存在Token(令牌),则用户是没有走正常路径进来,是非法请求

     if(server_token==null){

           return true;

     }

    //3、存储在Session中的Token(令牌)与表单提交的Token(令牌)不同,则依然是非法请求

     if(!client_token.equals(server_token)){

          return true;

      }

     return false;

    }

2、关键操作使用二次验证

     比如转账,即使用户登录了,即使受到了CSRF攻击,但当钱转出时,进行二次验证(短信验证码, 银行转账密码等等),验证不正确,则取消操作。

3、使用图形验证码

      提交图形验证码预防CSRF登录或其他关键操作。

4、通过检查referer要确定连接来自可信任来源。



以上是关于网络安全漏洞系列-CSRF漏洞攻防的主要内容,如果未能解决你的问题,请参考以下文章

被忽视的隐患-CSRF漏洞攻防实例分析

Web安全Day3 - CSRF实战攻防

网站攻防之CSRF和XSS跨站脚本攻击

常见(XSS|CSRF)六大Web安全攻防解析

CSRF攻防之道

每日安全资讯phpMyAdmin被曝存在严重CSRF漏洞可对数据库造成破坏