资讯专栏INFORMATION COLUMN

Laravel中的CSRF

RaoMeng / 1476人阅读

摘要:的处理在开启时为每个分配一个引入中间件后在里进行核心处理判断请求是否是这三种请求。获取请求中的验证通过后将加入响应包的里然后通过验证将请求通过递交给下一个处理件。

跨站点请求伪造CSRF攻击

攻击者盗用用户身份,通过伪造的身份以用户的名义进行非法请求从而在未经用户许可下完成某些非法操作。

Laravel的CSRF处理

在开启session时为每个session分配一个token

public function regenerateToken() {

$this->put("_token", Str::random(40));

}

引入VerifyCsrfToken中间件后在handle里进行核心处理

public function handle($request, Closure $next)
{

if (
    $this->isReading($request) ||
    $this->runningUnitTests() ||
    $this->inExceptArray($request) ||
    $this->tokensMatch($request)
) {
    return $this->addCookieToResponse($request, $next($request));
}

throw new TokenMismatchException;

}

- `$this->isReading()`判断请求是否是`["HEAD", "GET", "OPTIONS"]`这三种请求。
- `$this->runningUnitTests()`判断程序是否正在进行单元测试。
- `$this->inExceptArray()`判断请求是否需要进行Crsf验证。
- `$this->tokensMatch()`进行token验证。

        protected function tokensMatch($request)
        {
            // 获取请求url中的token
            $token = $this->getTokenFromRequest($request);
    
            return is_string($request->session()->token()) &&
                   is_string($token) &&
                   hash_equals($request->session()->token(), $token);
        }

        protected function getTokenFromRequest($request)
        {
            $token = $request->input("_token") ?: $request->header("X-CSRF-TOKEN");
    
            if (! $token && $header = $request->header("X-XSRF-TOKEN")) {
                $token = $this->encrypter->decrypt($header);
            }
    
            return $token;
        }

验证通过后将csrf token加入响应包的cookie里,然后通过验证将请求通过next递交给下一个处理件。

protected function addCookieToResponse($request, $response)
{

$config = config("session");

$response->headers->setCookie(
    new Cookie(
        "XSRF-TOKEN", $request->session()->token(), Carbon::now()->getTimestamp() + 60 * $config["lifetime"],
        $config["path"], $config["domain"], $config["secure"], false
    )
);

return $response;

}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/23254.html

相关文章

  • laravel认识之 路由控制(二) csrf 白名单设置

    摘要:之前简单的做了的传递参数,可能只是大多数中的一种吧,这里做一个请求的实例默认开启了防护功能当然也可以关闭这个功能,设置的文件路径如下注释掉的就关闭了全局的防护,但是一般不会这么做。 之前简单的做了url的get 传递参数,可能只是 大多数中的一种吧,这里做一个 post 请求的实例,laravel默认开启了csrf 防护功能,当然也可以关闭这个功能,设置的文件路径 app/Http/K...

    springDevBird 评论0 收藏0
  • laravel5.5手写教程3的基于资源路由的CURD操作(适合初学者)

    摘要:新增一篇新闻新增失败输入不符合要求请输入标题请输入内容新增文章上面代码中的是为了防攻击的,每个表单都必须存在。 本文我将结合简单例子,完成laravel框架下的增删改查,希望会对大家有所帮助。在进行之前,大家应该保证自己的数据库链接无误,artisan命令能正常使用,路由链接无问题。 一、创建控制器、路由避免影响其他路由,我们先注释掉之前联系时编写的所有路由。因为上一章我们已经学会建立...

    olle 评论0 收藏0
  • Laravel 5.4 入门系列 6. 文章的创建

    摘要:基本功能创建文章的第一步是用户发请求,然后返回创建文章的页面。实际上,会报错添加保护虽然我们完成了基本功能,但是提交请求的时候还是会报错,其实这是防止攻击。假如违反了规则,错误信息会自动被保存在闪存的中,即只对下一次请求生效。 基本功能 创建文章的第一步是用户发请求,然后返回创建文章的页面。 路由:处理用户「创建文章」的请求 /routes/web.php Route::get(/po...

    levius 评论0 收藏0
  • Laravel 常用的辅助函数

    摘要:中有很多非常有用的辅助函数表单这样就可以直接获取自身维护的,比如通常是这样用的或者你也可以这样,直接获取的表单这样就会直接在输出类似下面的内容了生成表单在使用路由的时候,有一些浏览器原生不能支持的,比如,等,这时候就可以使用一下代码来生成表 Laravel 中有很多非常有用的辅助函数(helper function) 1.csrf token 表单 {{ csrf_token() }}...

    RichardXG 评论0 收藏0
  • Laravel 组件之 Forms & HTML 组件 (laravelcollective

    摘要:原文地址安装首先通过来安装这个包编辑项目的文件在部分加入接下来从命令行更新接下来添加到的数组最后添加两个类链接到的数组创建表单打开表单默认是方法你可以随意指定其他接收方法表单仅仅支持和方法和方法将会使用一个隐藏域添加到表单中来欺骗实现你可 原文地址: Laravel Collective Forms & HTML 安装 首先通过 composer 来安装这个 包, 编辑项目的 comp...

    Amio 评论0 收藏0

发表评论

0条评论

RaoMeng

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<