所有表单对象_Laravel 表单方法伪造与 CSRF 攻击防护
1、表单方法伪造
有时候,我们可能需要手动定义发送表单数据所使用的 HTTP 请求方式,而 HTML 表单仅支持 GET
和 POST
两种方式,如果要使用其他的方式,则需要自己来定义实现。
HTTP 请求方式概述
最常见的 HTTP 请求方式自然是 GET 和 POST,相信你已经很熟悉,除此之外,HTTP 协议还定义了很多其他的请求方式,可以在 HTTP/1.1: Method Definitions 中查看 HTTP/1.1 协议支持的所有请求方式,不同的请求方式用于不同类型的请求:
OPTIONS:允许客户端查看服务器的性能。这个方法会请求服务器返回该资源所支持的所有 HTTP 请求方法,该方法会用'*'来代替资源名称,向服务器发送 OPTIONS 请求,可以测试服务器功能是否正常。JavaScript 的 XMLHttpRequest 对象进行 CORS 跨域资源共享时,就是使用 OPTIONS 方法发送嗅探请求,以判断是否有对指定资源的访问权限。
GET:请求指定的页面信息,并返回响应实体。一般来说 GET 方法应该只用于数据的读取,而不应当用于会产生副作用的非幂等的操作中。
HEAD:与GET方法一样,都是向服务器发出指定资源的请求,但是服务器在响应 HEAD 请求时不会回传资源的内容部分(即响应实体),这样我们在不传输全部内容的情况下,就可以获取服务器的响应头信息。HEAD方法常被用于客户端查看服务器的性能。
POST:向指定资源提交数据,请求服务器进行处理,如:表单数据提交、文件上传等,请求数据包含在请求体中。POST 方法是非幂等的方法,因为这个请求可能会创建新的资源或修改现有资源。
PUT:向指定资源位置上传其最新内容,PUT 方法是幂等的方法。通过该方法客户端可以将指定资源的最新数据传送给服务器取代指定的资源的内容,常用于修改指定资源。
DELETE:请求服务器删除所请求 URI 所标识的资源。DELETE 请求后指定资源会被删除,DELETE 方法也是幂等的。
TRACE:请求服务器回显其收到的请求信息,该方法主要用于 HTTP 请求的测试或诊断。
CONNECT:该方法是 HTTP/1.1 协议预留的,能够将连接改为管道方式的代理服务器。通常用于 SSL 加密服务器的链接与非加密的 HTTP 代理服务器的通信。
PATCH:出现的较晚,它在 2010 年的 RFC 5789 标准中被定义。PATCH 请求与 PUT 请求类似,同样用于资源的更新。二者有以下两点不同:1、PATCH 一般用于资源的部分更新,而 PUT 一般用于资源的整体更新;2、当资源不存在时,PATCH 会创建一个新的资源,而 PUT 只会对已在资源进行更新。
我们可以在命令行中通过 curl
进行一些简单的测试:

Laravel 中的 HTTP 请求方式
Laravel 路由支持通过上面的大部分常用请求方式:
/**
* Laravel 路由支持的 HTTP 请求方式
*
* @var array
*/
并为其提供了相应的路由定义方法:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
在浏览器地址栏访问某个 URL 采用的是 GET 请求,对于其他请求方式要怎么实现呢,一种方法是通过 HTML 表单元素的 method
属性,另一种方法是在 JavaScript 脚本中发起 HTTP 请求。对于 HTML 表单属性而言,有一个问题是 HTML 表单仅支持 GET 和 POST 请求,如果要使用其他请求方式怎么办?答案是通过表单方法伪造,下面我们就来介绍如何在 Laravel 中进行表单方法伪造。
表单请求方法伪造
要告知 Laravel 当前提交的表单使用的是 GET/POST 之外的其他请求方式,需要在表单中添加一个名为 _method
的隐藏字段,字段值是「PUT」、「DELETE」或 「PATCH」。Laravel 在处理提交表单请求时,会将字段值作为请求方式匹配对应的路由。比如下面这个表单:
<form action="/task/1" method="POST">
Laravel 会将其看作是 DELETE 请求,并将其匹配到对应的 Route::delete
路由进行处理,而不是 Route::post
路由。
其他请求方式实现方式也是一样,不再赘述。
2、CSRF 保护
在开始之前让我们来实现上述表单访问伪造的完整示例,为简单起见,我们在路由闭包中实现所有业务代码:
'task/{id}/delete',
在 http://blog.test/task/1/delete
点击「删除任务」按钮提交表单,会显示 419 异常页面:

初学者可能会困惑,这是什么原因呢?
不得不说,Laravel 5.7 引入的错误提示页面虽然好看,但是错误提示信息太少,这其实是因为默认情况下,为了安全考虑,Laravel 期望所有路由都是「只读」操作的(对应请求方式是 GET、HEAD、OPTIONS),如果路由执行的是「写入」操作(对应请求方式是 POST、PUT、PATCH、DELETE),则需要传入一个隐藏的 Token 字段(_token
)以避免[跨站请求伪造攻击](CSRF)。在我们上面的示例中,请求方式是 DELETE,但是并没有传递 _token
字段,所以会出现异常。
注:跨站请求伪造是一种通过伪装授权用户的请求来攻击授信网站的恶意漏洞,关于跨站请求伪造攻击可以参考维基百科了解明细:https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0。
避免跨站请求伪造攻击的措施就是对写入操作采用非 GET 方式请求,同时在请求数据中添加校验 Token 字段,Laravel 也是这么做的,这个 Token 值会在渲染表单页面时通过 Session 生成,然后传入页面,在每次提交表单时带上这个 Token 值即可实现安全写入,因为第三方站点是不可能拿到这个 Token 值的,所以由第三方站点提交的请求会被拒绝,从而避免 CSRF 攻击。
在 Laravel 中,和表单方法伪造一样,支持通过 HTML 表单隐藏字段传递这个值:
Route::get('task/{id}/delete', function ($id) {
return '<form method="post" action="' . route('task.delete', [$id]) . '">
<input type="hidden" name="_method" value="DELETE">
<input type="hidden" name="_token" value="' . csrf_token() . '">
<button type="submit">删除任务button>
form>';
});
这样我们再次访问 http://blog.test/task/1/delete
页面点击「删除任务」按钮,即可成功提交表单。
当然,如果你是在 JavaScript 脚本中执行 HTTP 请求,也可以很方便的传递这个 Token 值执行写入操作,首先需要在 HTML 标签内新增一个
元素来存储 Token 值:
<meta name="csrf-token" content="<?php echo csrf_token(); ?>" id="csrf-token">
然后我们在 JavaScript 脚本中将这个 Token 值放到一个全局请求头设置中,以便每个 HTTP 请求都会带上这个头信息,避免每次发起请求都要添加这个字段。如果你使用的是 jQuery 的话,可以这么做:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
如果你使用的是 Vue 的话,可以这么做:
(request, next) => {
Laravel 会在每次请求都检查请求头中是否包含 X-CSRF-TOKEN
,并检查其值是否和 Session 中的 Token 值是否一致。
注:如果你使用了 Laravel 自带的
assets/js/bootstrap.js
, 则上述 Vue 请求头设置不需要自己编写,因为bootstrap.js
中已经包含了这个逻辑。
排除指定 URL 不做 CSRF 保护
对于应用中某些第三方回调路由,如第三方登录或支付回调,无法做 Token 校验,需要将这些授信路由排除在 CSRF 校验之外,这个功能可以参考官方文档实现,很简单,就不再做额外的补充了。
(全文完)
长按下面的二维码,即可订阅学院君最新发布的 Laravel 入门系列教程:
关于本系列教程的更多动态,请点击页面左下角的「阅读原文」链接查看。
相关文章:

使用按钮控制HTML5背景音乐开关
<!DOCTYPE HTML> <html> <head> <meta charset"utf-8"> <meta name"viewport" content"widthdevice-width; initial-scale1.0"> <title>演示:使用按钮控制HTML5背景音乐开关</title></…

hibernate和struts2实现分页功能
1.DAO层接口的设计,定义一个PersonDAO接口,里面声明了两个方法: public interface PersonDAO {public List<Person> queryByPage(String hql, int offset, int pageSize);public int getAllRowCount(String hql); } 2.DAO层接口的实现类…

Cmake软件编译opencv报错,CMake Warning at cmake/OpenCVDownload.cmake:193 (message): FFMPEG: Download...
当执行如下操作时: 出现下面报错, 在链接ipaddress.com查询raw.githubusercontent.com地址,然后将ip添加至C:\Windows\System32\drivers\etc\hosts中: 保存后,重新在cmake软件中点击“Configure”等待即可。

Blender+SP+UE5游戏艺术工作流程学习
Blender到虚幻引擎5 Blender游戏艺术 Blender for Game Art 你会学到: 如何在Blender中创建三维模型 UV如何展开和布局 如何在Substance Painter中表现肌理 如何使用虚幻引擎5 如何在UE5中点亮室内环境 MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz&…

JQ 全选后获取选中的值_为什么在PBI中还需要切片器之三:Excel切片器之度量值切换...
Excel切片器之度量值切换原创 海峰没想到上篇文章一经发出,很快就过了10个留言,大喜过望,今天立马揭晓切片器之度量切换的应用。切片器之度量切换----参数法创建参数表,如下并导入数据模型创建需要的度量值,利润合计万…

layoutSubviews总结(转)
- (void)setNeedsDisplay- (void)drawRect但是是用initWithFrame 进行初始化时,当rect的值不为CGRectZero时,也会触发 You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want. layoutSubviews, …

PHP日期格式转时间戳
PHP 提供了函数可以方便的将各种形式的日期转换为时间戳,该类函数主要是: strtotime():将任何英文文本的日期时间描述解析为时间戳。mktime():从日期取得时间戳。strtotime() strtotime() 函数用于将英文文本字符串表示的日期转换…

TFmini传感器使用
使用激光传感器 打开地面站,Mavlink控制台输入tfmini start --> tfmini status -->显示 current_distance:数字 即可得到距离; 将timini插到口UART&I2C B上面 需要在自启动文件中添加tfmini的自启动,否则出来的数据是0;…

3DsMax渲染插件VRay NEXT完整的视频指南
要求 基本的计算机和三维软件知识 这门课程对初学者和进阶者都有好处 我们确实经历了许多你甚至不知道存在的功能 VRay NEXT for 3Ds Max – Complete Video Guide 欢迎来到V-RAY视频手册 流派:电子学习| MP4 |视频:h264,1280720 |音频:aac,44100 Hz语言…

MyEclipse中运行环境jre、编译级别、tomcat运行环境区别
运行环境JRE SYSTEM LIARARY引入项目中依赖的jdk基础包,在java build path --》library中可以切换 编译级别是项目编译成.class时使用的编译jdk版本,只能向下编译 tomcat运行环境选择jdk版本, 以上三个配置最好一致,如果不一致可以…

食堂就餐刷卡系统源码_智慧食堂重新定义你的食堂管理系统
智慧食堂有着针对于多种业态的适用行解决方案,可以说几乎是满足了所有团餐食堂,从进销存管理到财务系统再到智能硬件,让对食堂有着传统麻木观念的人群有了耳目一新的变化,下面就跟大家说几个智能硬件亮点,从新帮你定义…

2022-2028年全球与中国闪光棉市场研究及前瞻分析报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了全球与中国闪光棉行业市场行业相关概述、全球与中国闪光棉行业市场行业运行环境、分析了全球与…

WebAPI初探
由于即将要接手的新项目计划用ASP.NET MVC3来开发,所以最近一段时间一直在看相关的书或文章。因为之前在大学里也曾学习过MVC2开发,也做过几个简单的MVC2的小型测试项目,不过在后来工作以后主要还是开发WebForm的项目,所以MVC的东…

ROS控制无人机offboard模式
在确保已经安装ROS以及Mavros情况下使用下列步骤 1.打开PX4源码程序,运行gazebo cd Firmware make px4_sitl_default gazebo2.打开Mavros roslaunch mavros px4.launch fcu_url:"udp://:14540127.0.0.1:14557"3.运行功能包程序 rosrun offboard_node o…

业余快速学习虚幻引擎教程
仅用5小时学会虚幻引擎! 你会学到什么 专为希望在业余时间打造虚幻引擎技能的艺术家和开发人员量身定制的专业技术 从几何图形到材料,从照明到互动,所有方面的提示 探索如何创造建筑水的效果 如何使用顶点绘制交互绘制多种材质 如何将特定地…

bpython ipython_安装ipython后命令找不到ipython bpython -bash: *python: command not found
原博文 2018-10-30 21:53 − ipython bpython -bash: *python: command not found 问题: 当pip安装ipython, bpython后, 直接执行ipython or bpython会报错:*python... 相关推荐 2019-12-09 17:35 − 运行xcall.sh jps时提示,报错“bash: jps…

js正则表达式/replace替换变量方法
转自:http://www.blogjava.net/pingpang/archive/2012/08/12/385342.html 1. javascript 正则对象替换创建和用法:/pattern/flags 先简单案例学习认识下replace能干什么: 正则表达式构造函数: new RegExp("pattern"[,"flags&q…

第二版地面站加入"参数列表"
1. 连接界面 2. 电子地图 3. 参数列表后续新加入功能:待加入…

Blender中的主程序纹理学习课程 Master Procedural Texturing in Blender
挖掘Blender不可思议的强大节点编辑器的无限潜力。 你会学到: 逐步构建高级和高度可定制的程序纹理。 将许多不同层次的细节结合成一个复杂而现实的结果。 从头开始构建高级程序纹理背后的思维过程。 使用组节点为您的材料创建超级方便的定制。 课程获取:Blender中…

适合win7的python版本_windows下多个python版本共存,如何在Windows7系统上安装最新的64位Python3.6.2...
windows下多个python版本共存,如何在Windows7系统上安装最新的64位Python3.6.2 1、官网下载python3.6.2 https://www.python.org/ftp/python/3.6.2/python-3.6.2-amd64.exe 2、安装,选择自定义安装,直接安装到D盘目录下方便查找,把…

day18——sql优化——绑定变量
SQL> create table t(id int);SQL> set timing onSQL> variable x number; (声明x变量)SQL> exec :x :8SQL> insert into t values(:x);SQL> select * from t;SQL> commit;SQL> declare2 i number;3 sqlstr varchar(2000);4 …

2022-2028年全球与中国人字拖市场研究及前瞻分析报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了全球与中国人字拖行业市场行业相关概述、全球与中国人字拖行业市场行业运行环境、分析了全球与…

【翻译】Ext JS 6 Beta发布
原文:Ext JS 6 Beta is Now Available 概述Ext JS 6的好处新的Ext JS功能和工具需要你的反馈意见概述 很高兴,Ext JS 6 beta版本现在发布了。该版本是为了让你、社区来测试和评估Ext JS 6工作进度的。这是协助创建最好的Ext JS发布版本的最好方式。 对于…

PX4编写msg文件
在msg文件夹下,创建一个msg文件,然后在CMakkeLists.txt里面声明一下,然后在终端打开项目文件,Firmware,输入指令:make px4_fmu-v5_default,编译即可在/home/xx/xxx/Firmw…

UE4风格化场景设计入门指南 Stylized Station – The Environment Artist’s Survival Kit
持续时间13h 1920X1080 .ts 包含项目文件 大小解压后:4.9G 语言:英语中文字幕(人工校对) 标题:风格化的车站——环境艺术家的生存工具包 信息: 环境艺术很难。 尤其是作为初学者,就像你自己一样。有大量的工作流程&am…

python如何调用文件_如何调用另一个python文件中的代码
原博文 2017-07-10 15:56 − 无论我们选择用何种语言进行程序设计时,都不可能只有一个文件(除了“hello world”),通常情况下,我们都需要在一个文件中调用另外一个文件的函数呀数据等等,总之要操作其他文件…

C++中模块(Dll)对外暴露接口的方式
总结下C中模块(Dll)对外暴露接口的方式: (1)导出API函数的方式这种方式是Windows中调用DLL接口的最基本方式,GDI32.dll, User32.dll都是用这种方式对外暴露系统API的。这种方式的优点是导出函数没有语言限制,什么语言都能调用;缺点…

LVS详解及基于LVS实现web服务器负载均衡
前言LVS(Linux Virtual Server)Linux虚拟服务器,是一个虚拟的服务器集群系统。本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一。通过LVS提供的负载均衡技术和Linux操作系统可实现一个高性能、高可用的服务器群集,从…

解决Ubuntu系统下git clone下载速度较慢的问题(亲测有效)
常见问题使用Git clone下载网速通常有十几kb,下载较慢. 使用以下指令即可解决: //这是我们要clone的,通常是github.com需要替换掉,就是在github.com后面加上.cnpmjs.org就可以了 git clone https://github.com/Hacker…

Revit结构2021专业人士的选择:从入门到专业
Revit结构2021专业人士的选择:从入门到专业 Revit Structure 2021 : 13th Floor Concrete Building 你会学到: Revit结构中的第13栋混凝土建筑 在Revit结构中启动新项目 创建级别的基本方法 创建关卡的技巧 在Revit结构2021中处理主要和次要问题 网格的绘制 直线和曲线网格 圆…