[PHP] - Laravel - CSRF token禁用方法

前文

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

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

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



方法一

打开文件:app\Http\Kernel.php

把这行注释掉:

‘App\Http\Middleware\VerifyCsrfToken‘

方法二

打开文件:app\Http\Middleware\VerifyCsrfToken.php

修改为:

<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $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方式,需要把app\Http\Middleware\VerifyCsrfToken.php修改为:

<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $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 App\Http\Middleware;

use Closure;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;

class VerifyCsrfToken extends BaseVerifier {

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $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,如:

要修改这个名称值,可以到打开这个文件:vendor\laravel\framework\src\Illuminate\Foundation\Http\Middleware\VerifyCsrfToken.php

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

当然,你也可以在app\Http\Middleware\VerifyCsrfToken.php文件中,重写addCookieToResponse(...)方法做到。



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

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

时间: 2024-11-05 02:40:06

[PHP] - Laravel - CSRF token禁用方法的相关文章

Laravel API CSRF token mismatch

在Laravel 中创建了API 接口. 当前端发送POST请求时, 查看 network 收到如下错误提示: message: "CSRF token mismatch." 解决方法: 在 app\Http\Middleware\VerifyCsrfToken.php 中添加需要排除的请求路由. 原文地址:https://blog.51cto.com/12603214/2469045

&quot;CSRF token missing or incorrect.&quot;的解决方法.

现象: Forbidden (403)CSRF verification failed. Request aborted.HelpReason given for failure:CSRF token missing or incorrect. In general, this can occur when there is a genuine Cross Site Request Forgery, or when Django's CSRF mechanism has not been use

Invalid CSRF Token &#39;null&#39; was found on the request parameter &#39;_csrf&#39; or header &#39;X-CSRF-TOKEN&#39;

Spring Security :HTTP Status 403-Invalid CSRF Token 'null' was found on the request parameter '_csrf' or header 'X-CSRF-TOKEN'. 原因:1.Spring Security 4.0之后,引入了CSRF,默认是开启.CSRF默认支持的方法: GET|HEAD|TRACE|OPTIONS,不支持POST. Spring Security 3默认关闭csrf,Spring Sec

关于 DjangoUeditor 上传图片图片失败,csrf token missing or incorrect 的解决办法

Forbidden (CSRF token missing or incorrect.): /ueditor/controller/ [27/Jun/2017 23:49:25] "POST /ueditor/controller/?imagePathFormat=courses%2Fueditor%2F&filePathFormat=courses%2Fueditor%2F&action=uploadvideo&encode=utf-8 HTTP/1.1" 4

sqlmap和burpsuite绕过csrf token进行SQL注入检测

利用sqlmap和burpsuite绕过csrf token进行SQL注入 转载请注明来源:http://www.cnblogs.com/phoenix--/archive/2013/04/12/3016332.html 问题:post方式的注入验证时遇到了csrf token的阻止,原因是csrf是一次性的,失效导致无法测试. 解决方案:Sqlmap配合burpsuite,以下为详细过程,参照国外牛人的blog(不过老外讲的不是很细致,不适合我等小白). 1.打开burpsuite(以1.5为

burpsuite设置宏绕过csrf token

为了防止csrf和表单重复提交,有些系统使用了Token机制,具体机制可自行研究,这对我们的个别测试造成了一定的不便. 解决思路: 1.将获取token的操作设置为宏,自动完成每次重新获取token的操作(最为省时,但比较麻烦) 2.测试阶段让开发将token设为一个定值(最为方便) 3.全部测试均使用proxy模块(最为简单,但最为耗时,且无法完成高级自动化测试功能) 针对思路1,百度了一下,发现答案同质化严重,基本均参考外国博客: https://labs.asteriskinfosec.c

使用Ajax (put delete ) django原生CBV 出现csrf token解决办法

原文地址: https://blog.csdn.net/weixin_35993084/article/details/80778921 修改ajax中type方式并设置header,同时对put重新构建数据字典 在对views中的方法进行类对象封装时,发现django并不支持像post和get一样将数据封装. 由于网页端无法设置method方法,在用postman和ajax开启pycharm对接口进行debug测试时发现:提交数据后并没有进入代码逻辑. 查阅资料得知,django支持put和d

Forbidden (CSRF token missing or incorrect.):错误解决办法

在JS中,使用post方法提交数据到后台,出现错误: Forbidden (CSRF token missing or incorrect.):.........; 解决办法: 在页面导入JS的位置,补上以下代码即可: 1 <script> 2 $.ajaxSetup({ 3 data:{csrfmiddlewaretoken:'{{ csrf_token }}'} 4 }) 5 </script> 原文地址:https://www.cnblogs.com/lhb-alan/p/1

融云SDK:获取用户Token的方法

融云SDK查看ServerAPI里面有个获取Token的方法,本以为只要传三个参数就可以.后来发现,在请求头有几个必须要传的参数,否则服务器返回401(未授权).拿获取Token接口为例子 如图所示,请求头中包含 : App-Key(应用appkey), Nonce(随机数,不限长度),Timestamp(时间戳from1970),Signature(签名).签名生成的方法 就是 sha1(appsecret+Nonce+Timestamp) 只有这几个请求头的值都正确了,接口才能正确返回Tok