翻译、衍生自:https://laravel-china.org/docs/laravel/5.5/csrf
使用 Laravel 能够很简单的避免 跨站请求伪造(CSRF) 攻击。跨站请求伪造是一种恶意攻击,通过这种操作,认证用户可以执行未经授权的命令。
Laravel 为每个用户回话自动生成 CSRF 令牌。此令牌用于验证认证用户就是实际向应用程序发出请求的用户。
在应用程序中凡是使用 HTML 表单的地方,都应该包含一个名为 _token
的隐藏域,这个字段值就是 CSRF 令牌,随请求发往后台的时候,会经 CSRF 中间件验证。 咱可以使用 csrf_field
辅助函数生成这个隐藏域。
<form method="POST" action="/profile">
{{ csrf_field() }}
...
</form>
刚才提到的 CSRF 中间件,就是名为 VerifyCsrfToken
的中间件,位于 app/Http/Middleware/VerifyCsrfToken.php
,它定义在 web
中间件组里,所以对所有的 Web 请求接口都生效。VerifyCsrfToken
会验证请求里的令牌和保存在回话里的令牌值是否一样。
在构建 JavaScript 驱动型的应用程序时,给你的 JavaScript HTTP 库附加 CSRF 令牌也很方便。默认,resources/assets/js/bootstrap.js
文件中为 Axios HTTP 库附加了 CSRF 令牌,令牌是从 HTML 的 <meta name="csrf-token" content="{{ csrf_token() }}">
这个标签里取到的。
/**
* We'll load the axios HTTP library which allows us to easily issue requests
* to our Laravel back-end. This library automatically handles sending the
* CSRF token as a header based on the value of the "XSRF" token cookie.
*/
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
/**
* Next we will register the CSRF Token as a common header with Axios so that
* all outgoing HTTP requests automatically have it attached. This is just
* a simple convenience so we don't have to attach every token manually.
*/
let token = document.head.querySelector('meta[name="csrf-token"]');
if (token) {
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
console.error('CSRF token not found: https://laravel-china.org/docs/laravel/csrf#csrf-x-csrf-token');
}
如果你不是用 Axios 作为 HTTP 请求库的话(比如用 jQuery),那么就需要你手动配置了。
应用程序中,并不是所有的请求都需要经过 CSRF 令牌验证。例如,当你使用 Stripe 处理支付流程并且使用了它们的 wekhook 系统的时候,你就需要把所有与 Stripe 相关的 URI 排除在 CSRF 保护队列之外,因为 Stripe 可不知道要给你的路由发送什么 CSRF 令牌值。
遇到这种情况,你的路由要么不放在 routes/web.php
中(因为这个文件里的路由都附加了 web
中间件),当然这很麻烦,所以我们不这么做。怎么做呢?很简单,只要在 VerifyCsrfToken
中间件的 $except
属性里添加你要排除在 CSRF 保护之外的 URIs 就可以了。
<?php
namespace App\Http\Middleware;
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as BaseVerifier;
class VerifyCsrfToken extends BaseVerifier
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'stripe/*',
];
}
VerifyCsrfToken
中间件除了会检查以 POST 参数形式传递过来的 CSRF 令牌之外,也检查请求头的 X-CSRF-TOKEN
字段。我们可以把令牌放在 meta
标签里:
<meta name="csrf-token" content="{{ csrf_token() }}">
这样一个 meta
标签创建好后,我们就可以向 jQuery 这一类库中附加 X-CSRF-TOKEN
标头字段,之后的每次 HTTP 请求里都会包含这个信息。
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
需要注意的是,在 resources/assets/js/bootstrap.js
这个文件中,默认为 Axios 这个 HTTP 请求库附加的 CSRF 令牌,也是从上面的 meta
标签里获取的。如果你不是用 Axios 作为 HTTP 请求库的话,就需要向上面设置 jQuery 那样手动配置了。
Laravel 还将应用程序里的 CSRF 令牌保存在了名为 XSRF-TOKEN
的 cookie 里,这个 cookie 在程序的每次相应中都会携带。你可以用这个 cookie 值设置 X-XSRF-TOKEN
请求头。
这个 cookie 主要是为其他一些 JavaScript 框架和库提供便利,比如 Angular 和 Axios,它们会自动将这个名为 XSRF-TOKEN
的 cookie 值放在 X-XSRF-TOKEN
这个请求头里。
Original url: Access
Created at: 2018-10-10 18:54:05
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
java windows火焰图_mob64ca12ec8020的技术博客_51CTO博客 - 在windows下不可行,不知道作者是怎样搞的 监听SpringBoot 服务启动成功事件并打印信息_监听springboot启动完毕-CSDN博客 SpringBoot中就绪探针和存活探针_management.endpoint.health.probes.enabled-CSDN博客 u2u转换板 - 嘉立创EDA开源硬件平台 Spring Boot 项目的轻量级 HTTP 客户端 retrofit 框架,快来试试它!_Java精选-CSDN博客 手把手教你打造一套最牛的知识笔记管理系统! - 知乎 - 想法有重合-理论可参考 安宇雨 闲鱼 机械键盘 客制化 开贴记录 文本 linux 使用find命令查找包含某字符串的文件_beijihukk的博客-CSDN博客_find 查找字符串 ---- mac 也适用 安宇雨 打字音 记录集合 B站 bilibili 自行搭建 开坑 真正的客制化 安宇雨 黑苹果开坑 查找工具包maven pom 引用地 工具网站 Dantelis 介绍的玩轴入坑攻略 --- 关于轴的一些说法 --- 非官方 ---- 心得而已 --- 长期开坑更新 [本人问题][新开坑位]关于自动化测试的工具与平台应用 机械键盘 开团 网站记录 -- 能做一个收集的程序就好了 不过现在没时间 -- 信息大多是在群里发的 - 你要让垃圾佬 都去一个地方看难度也是很大的 精神支柱 [超级前台]sprinbboot maven superdesk-app 记录 [信息有用] [环境准备] [基本完成] [sebp/elk] 给已创建的Docker容器增加新的端口映射 - qq_30599553的博客 - CSDN博客 [正在研究] Elasticsearch, Logstash, Kibana (ELK) Docker image documentation elasticsearch centos 安装记录 及 启动手记 正式服务器 39 elasticsearch 问题合集 不断更新 6.1.1 | 6.5.1 两个版本 博客程序 - 测试 - bug记录 等等问题 laravel的启动过程解析 - lpfuture - 博客园 OAuth2 Server PHP 用 Laravel 搭建带 OAuth2 验证的 RESTful 服务 | Laravel China 社区 - 高品质的 Laravel 和 PHP 开发者社区 利用Laravel 搭建oauth2 API接口 附 Unauthenticated 解决办法 - 煮茶的博客 - SegmentFault 思否 使用 OAuth2-Server-php 搭建 OAuth2 Server - 午时的海 - 博客园 基于PHP构建OAuth 2.0 服务端 认证平台 - Endv - 博客园 Laravel 的 Artisan 命令行工具 Laravel 的文件系统和云存储功能集成 浅谈Chromium中的设计模式--终--Observer模式 浅谈Chromium中的设计模式--二--pre/post和Delegate模式 浅谈Chromium中的设计模式--一--Chromium中模块分层和进程模型 DeepMind 4 Hacking Yourself README.md update 20211011
Laravel China 简书 知乎 博客园 CSDN博客 开源中国 Go Further Ryan是菜鸟 | LNMP技术栈笔记 云栖社区-阿里云 Netflix技术博客 Techie Delight Linkedin技术博客 Dropbox技术博客 Facebook技术博客 淘宝中间件团队 美团技术博客 360技术博客 古巷博客 - 一个专注于分享的不正常博客 软件测试知识传播 - 测试窝 有赞技术团队 阮一峰 语雀 静觅丨崔庆才的个人博客 软件测试从业者综合能力提升 - isTester IBM Java 开发 使用开放 Java 生态系统开发现代应用程序 pengdai 一个强大的博主 HTML5资源教程 | 分享HTML5开发资源和开发教程 蘑菇博客 - 专注于技术分享的博客平台 个人博客-leapMie 流星007 CSDN博客 - 舍其小伙伴 稀土掘金 Go 技术论坛 | Golang / Go 语言中国知识社区
最新评论