HTTP层 —— CSRF保护

简介

跨站请求伪造是一种通过伪装授权用户的请求来利用授信网站的恶意漏洞。Laravel 使得防止应用遭到跨站请求伪造攻击变得简单。

Laravel 自动为每一个被应用管理的有效用户会话生成一个 CSRF “令牌”,该令牌用于验证授权用户和发起请求者是否是同一个人。

任何时候在 Laravel 应用中定义HTML表单,都需要在表单中引入CSRF令牌字段,这样CSRF保护中间件才能够正常验证请求。想要生成包含 CSRF 令牌的隐藏输入字段,可以使用辅助函数 csrf_field 来实现:

<form method="POST" action="/profile">
    {{ csrf_field() }}
    ...
</form>

中间件组 web 中的中间件VerifyCsrfToken 会自动为我们验证请求输入的 token 值和 Session 中存储的 token 是否一致。

从 CSRF 保护中排除指定 URL

有时候我们需要从 CSRF 保护中排除一些 URL,例如,如果你使用了 Stripe 来处理支付并用到他们的 webhook 系统,这时候就需要从 Laravel 的 CSRF 保护中排除  webhook 处理器路由,因为Stripe并不知道要传什么token值给我们定义的路由。

通常我们需要将这种类型的路由放到文件 routes/web.php 里,中间件组 web 之外。此外,你也可以在 VerifyCsrfToken 中间件中将要排除的 URL 添加到 $except 属性数组:

<?php

namespace App\Http\Middleware;

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

class VerifyCsrfToken extends BaseVerifier
{
    /**
     *从CSRF验证中排除的URL
     *
     * @var array
     */
    protected $except = [
        ‘stripe/*‘,
    ];
}
X-CSRF-Token

除了将 CSRF 令牌作为 POST 参数进行验证外,还可以通过设置 X-CSRF-Token 请求头来实现验证,VerifyCsrfToken 中间件会检查 X-CSRF-TOKEN 请求头,首先创建一个 meta 标签并将令牌保存到该 meta 标签:

<meta name="csrf-token" content="{{ csrf_token() }}">

然后在 js 库(如 jQuery)中添加该令牌到所有请求头,这为基于 AJAX 的应用提供了简单、方便的方式来避免 CSRF 攻击:

$.ajaxSetup({
    headers: {
        ‘X-CSRF-TOKEN‘: $(‘meta[name="csrf-token"]‘).attr(‘content‘)
    }
});
X-XSRF-Token

Laravel 还会将 CSRF 令牌保存到名为 XSRF-TOKEN 的 Cookie 中,你可以使用该 Cookie 值来设置 X-XSRF-TOKEN请求头。一些 JavaScript 框架,比如  Angular,会为你自动进行设置,基本上你不太需要手动设置这个值。

时间: 2024-10-13 14:48:05

HTTP层 —— CSRF保护的相关文章

laravel5.2总结--csrf保护

CSRF攻击: CSRF 顾名思义,是伪造请求,冒充用户在站内的正常操作.我们知道,绝大多数网站是通过 cookie 等方式辨识用户身份(包括使用服务器端 Session 的网站,因为 Session ID 也是大多保存在 cookie 里面的),再予以授权的.所以要伪造用户的正常操作,最好的方法是通过 XSS 或链接欺骗等途径,让用户在本机(即拥有身份 cookie 的浏览器端)发起用户所不知道的请求. Laravel 会自动生成一个 CSRF token 给每个用户的 Session.该 t

如何模拟登陆添加了CSRF保护的网站

上次写了篇文章,内容是如何利用WebClient模拟登陆CSRF控制的网站,回复中有人还是不理解,现在另开一篇,打算说说用Python如何来登陆. 开写之前,先说下为什么webrequest不行,常规情况下,我们在利用webrequest的时候,都是如下的形式: 1 string url = "loginurl"; 2 StringBuilder sb = new StringBuilder(); 3 sb.Append("username=un"); 4 sb.A

laravel csrf保护

有时候我们的项目需要和外部的项目进行接口对接,如果是post的方式请求;laravel要求csrf保护 但是别人是ci框架或者没有csrf_token的;该如何处理呢? 可以把我们不需要csrf的url加入到白名单中 学习来源: http://laravelacademy.org/post/6742.html 然后一般模拟接口请求的时候,可以用firefox的RESTClient来模拟 如果是post请求的话 在正文中 直接写 id=1&&name=hhh 还需要一个header头:Con

4 Template层-CSRF

阅读目录 1.csrf 2 .演示csrf 3.防csrf的使用 3.保护原理 4.取消保护 回到顶部 1.csrf 全称Cross Site Request Forgery,跨站请求伪造 某些恶意网站上包含链接.表单按钮或者JavaScript,它们会利用登录过的用户在浏览器中的认证信息试图在你的网站上完成某些操作,这就是跨站攻击 回到顶部 2 .演示csrf 创建视图csrf1用于展示表单,csrf2用于接收post请求 def csrf1(request): return render(r

Laravel5.0 CSRFチェックを無効化(修改后可以像5.1以上那样从CSRF保护中排除指定URL)

Laravel5では全てのPOSTに勝手にCSRFチェックが付いてきます.便利と言えば便利ですが.Laravel外からのPOSTを受け取りたいときなど大迷惑です. CSRFチェックを排除する方法が何故かなかなか見当たらなかったので調査結果を記載. Kernel デフォルトで適用されるミドルウェアはapp/Http/Kernel.phpに記載されています.'App\Http\Middleware\VerifyCsrfToken'が書かれている行を削除するとCSRFチェックが無効化されます. この場

Django 的 CSRF 保护机制(转)

add by zhj:其实我个人推荐前端不要将数据放在cookie中,而是放在其它本地存储(HTML5中称之为Web Storage),本地存储与cookie的一 个重要区别在于:本地数据不会自动加在http请求中.这样也就不会有CSRF了.假设用户登录了网站A,而在网站B中有一个CSRF攻击标签,点 击这个标签就会访问网站A,如果前端数据(包括sessionid)都放在本地存储的话,当在网站B点击CSRF攻击标签时,标签绑定的方法是无法获 取网站A本地存储中的sessionid的,这样用户在服

Django 的 CSRF 保护机制

用 django 有多久,我跟 csrf 这个概念打交道就有久了. 每次初始化一个项目时都能看到 django.middleware.csrf.CsrfViewMiddleware 这个中间件 每次在模板里写 form 时都知道要加一个 {% csrf_token %} tag 每次发 ajax POST 请求,都需要加一个 X_CSRFTOKEN 的 header 但是一直我都是知其然而不知其所以然,没有把 csrf 的机制弄清楚.昨天稍微研究了一下,总结如下. 什么是 CSRF CSRF,

laravel CSRF 保护

在开始之前让我们来实现上述表单访问伪造的完整示例,为简单起见,我们在路由闭包中实现所有业务代码: Route::get('task/{id}/delete', function ($id) { return '<form method="post" action="' . route('task.delete', [$id]) . '"> <input type="hidden" name="_method"

前后端分离,解决跨域问题及django的csrf跨站请求保护

1. 前后端分离解决跨域问题 解决跨域调用服务并设置headers 主要的解决方法需要通过服务器端设置响应头.正确响应options请求,正确设置 JavaScript端需要设置的headers信息 方能实现: 关于跨域,前端会先发送OPTIONS请求,进行预检,检查后端是否允许前端设置的相应的请求头,请求内容 function getCookie(name) { var cookieValue = null; if (document.cookie && document.cookie