zoukankan      html  css  js  c++  java
  • [PHP]

    前文

    CSRF攻击和漏洞的参考文章:

    http://www.cnblogs.com/hyddd/archive/2009/04/09/1432744.html

    Laravel默认是开启了CSRF功能,需要关闭此功能有两种方法:


    方法一

    打开文件:appHttpKernel.php

    把这行注释掉:

    'AppHttpMiddlewareVerifyCsrfToken'

    方法二

    打开文件:appHttpMiddlewareVerifyCsrfToken.php

    修改为:

    复制代码
    <?php namespace AppHttpMiddleware;
    
    use Closure;
    use IlluminateFoundationHttpMiddlewareVerifyCsrfToken as BaseVerifier;
    
    class VerifyCsrfToken extends BaseVerifier {
    
        /**
         * Handle an incoming request.
         *
         * @param  IlluminateHttpRequest  $request
         * @param  Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            // 使用CSRF
            //return parent::handle($request, $next);
            // 禁用CSRF
            return $next($request);
        }
    
    }
    复制代码

    CSRF的使用有两种,一种是在HTML的代码中加入:

    <input type="hidden" name="_token" value="{{ csrf_token() }}" />

    另一种是使用cookie方式。

    使用cookie方式,需要把appHttpMiddlewareVerifyCsrfToken.php修改为:

    复制代码
    <?php namespace AppHttpMiddleware;
    
    use Closure;
    use IlluminateFoundationHttpMiddlewareVerifyCsrfToken as BaseVerifier;
    
    class VerifyCsrfToken extends BaseVerifier {
    
        /**
         * Handle an incoming request.
         *
         * @param  IlluminateHttpRequest  $request
         * @param  Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            return parent::addCookieToResponse($request, $next($request));
        }
    
    }
    复制代码

    使用cookie方式的CSRF,可以不用在每个页面都加入这个input的hidden标签。

    当然,也可以对指定的表单提交方式使用CSRF,如:

    复制代码
    <?php namespace AppHttpMiddleware;
    
    use Closure;
    use IlluminateFoundationHttpMiddlewareVerifyCsrfToken as BaseVerifier;
    
    class VerifyCsrfToken extends BaseVerifier {
    
        /**
         * Handle an incoming request.
         *
         * @param  IlluminateHttpRequest  $request
         * @param  Closure  $next
         * @return mixed
         */
        public function handle($request, Closure $next)
        {
            // Add this:
            if($request->method() == 'POST')
            {
                return $next($request);
            }
            
            if ($request->method() == 'GET' || $this->tokensMatch($request))
            {
                return $next($request);
            }
            throw new TokenMismatchException;
        }
    
    }
    复制代码

    只对GET的方式提交使用CSRF,对POST方式提交表单禁用CSRF


    修改CSRF的cookie名称方法

    通常使用CSRF时,会往浏览器写一个cookie,如:

    要修改这个名称值,可以到打开这个文件:vendorlaravelframeworksrcIlluminateFoundationHttpMiddlewareVerifyCsrfToken.php

    找到”XSRF-TOKEN“,修改它即可。

    当然,你也可以在appHttpMiddlewareVerifyCsrfToken.php文件中,重写addCookieToResponse(...)方法做到。


    另外,如需要对指定的页面不使用CSRF,可以参考如下文章:

    http://www.camroncade.com/disable-csrf-for-specific-routes-laravel-5/

  • 相关阅读:
    Java网络编程
    loj#6517. 「雅礼集训 2018 Day11」字符串(回滚莫队)
    bzoj4241: 历史研究(回滚莫队)
    洛谷P5050 【模板】多项式多点求值
    loj#6053. 简单的函数(Min_25筛)
    【BZOJ4144】[AMPPZ2014]Petrol(最短路+最小生成树+并查集)
    51nod 1781 Pinball(线段树)
    CF1110D Jongmah
    CF1106F Lunar New Year and a Recursive Sequence(矩阵快速幂+bsgs+exgcd)
    20. Valid Parentheses
  • 原文地址:https://www.cnblogs.com/yzloo/p/10802234.html
Copyright © 2011-2022 走看看