分析Laravel框架的表单方法伪造
时间:2021-07-25
本文章向大家介绍分析Laravel框架的表单方法伪造,主要包括分析Laravel框架的表单方法伪造使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
HTML 表单不支持 PUT
、PATCH
或 DELETE
行为。但是我们在使用Laravel框架的时候,仍然可以定义一个仅支持PUT的路由:
Route::put('update', function (\Illuminate\Http\Request $request) {
dd($_SERVER['REQUEST_METHOD'], $request->getMethod());
});
只需要在html的表单中加入:
<form action="/update" method="POST">
<input type="hidden" name="_method" value="PUT">
<input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
使用起来是挺简单的,但你是否注意到,Laravel的表单方法伪造只有在form表单的method="POST"才会生效,这是为什么?带着这个小问题,我们来看看框架是怎么实现伪造的。
阅读源码
Laravel的路由匹配http请求时,是调用Request
类getMethod()
方法获取method
属性值,再根据这个属性值进行匹配然后分发路由的。
我们追踪\Illuminate\Http\Request类的getMethod方法,发现是继承自\Symfony\Component\HttpFoundation,源码如下:
public function getMethod()
{
// 追踪了method这个属性,发现除了在这个方法内,其他地方都是把这个属性设置为null,所以第一次调用getMethod方法时,$this->method必定为null。
if (null !== $this->method) {
return $this->method;
}
// $_SERVER['REQUEST_METHOD']为HTTP的请求方式
$this->method = strtoupper($this->server->get('REQUEST_METHOD', 'GET'));
// 只有POST请求,才可以进行表单方法伪造。
if ('POST' !== $this->method) {
return $this->method;
}
$method = $this->headers->get('X-HTTP-METHOD-OVERRIDE');
// 关于self::$httpMethodParameterOverride这个属性,Laravel框架在启动之前,便把它设置会true了,所以进入这个条件分支
if (!$method && self::$httpMethodParameterOverride) {
// 这一句代码的意思优先拿$_POST中的_method字段,若不存在则去拿$_GET中的_method字段。
$method = $this->request->get('_method', $this->query->get('_method', 'POST'));
}
// 伪造的请求方式必须是字符串
if (!\is_string($method)) {
return $this->method;
}
$method = strtoupper($method);
// 必须是合法的请求方式
if (\in_array($method, ['GET', 'HEAD', 'POST', 'PUT', 'DELETE', 'CONNECT', 'OPTIONS', 'PATCH', 'PURGE', 'TRACE'], true)) {
return $this->method = $method;
}
if (!preg_match('/^[A-Z]++$/D', $method)) {
throw new SuspiciousOperationException(sprintf('Invalid method override "%s".', $method));
}
return $this->method = $method;
}
阅读这段代码,我们就可以知道,Laravel的表单方法伪造只不过是修改 \Illuminate\Http\Request
类的method
属性值,并不会改变http的真实请求方式。
到这里,关于Laravel的表单方法伪造只有在form表单的method="POST"才会生效
这个问题,我们可以轻易的解释了:这一切只不过是框架与HTML表单之间的一个约定,定义了表单方法伪造的方式。
原文地址:https://www.cnblogs.com/tianjiankun/p/15058972.html
- 删除链表中的重复元素
- Single Number and Single Number II
- 前端限制上传文件的类型
- JavaSript模块规范 - AMD规范与CMD规范介绍
- [大数据之Sqoop] —— Sqoop初探
- [大数据之Sqoop] —— 什么是Sqoop?
- Node.js包管理器Yarn的入门介绍与安装
- static_cast ,reinterpret_cast
- NodeJS使用formidable实现文件上传
- 签下北方最大港口,聚焦无人驾驶卡车技术的主线科技朝商业化又进一步
- 对缓存的思考——提高命中率
- 实用手册:130+ 提高开发效率的 vim 常用命令
- Sqoop切分数据的思想概况
- 设计模式分类
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC