常见PHP框架CSRF防范方案分析

2024-09-04 05:48

本文主要是介绍常见PHP框架CSRF防范方案分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

什么是CSRF

CSRF(跨站请求伪造)是一种恶意的攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令。网上有很多相关介绍了,具体攻击方式就不细说了,下面来说说LaravelYii2是如何来做CSRF攻击防范的。

Laravel CSRF防范

本次对Laravel CSRF防范源码的分析是基于5.4.36版本的,其他版本代码可能有所不同,但原理是相似的。

Laravel通过中间件app/Http/Middleware/VerifyCsrfToken.php来做CSRF防范,来看下源码。

<?phpnamespace 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 = [//];
}

可以发现它是直接继承了Illuminate\Foundation\Http\Middleware\VerifyCsrfToken,只是提供了配置不进行CSRF验证的路由的功能(这里是因为某些场景下是不需要进行验证的,例如微信支付的回调)。

再来看下Illuminate\Foundation\Http\Middleware\VerifyCsrfToken主要源码。

    /*** Handle an incoming request.** @param  \Illuminate\Http\Request  $request* @param  \Closure  $next* @return mixed** @throws \Illuminate\Session\TokenMismatchException*/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;}

这里handle是所有路由经过都会执行的方法。可以看到中间件先判断是否是读请求,例如'HEAD', 'GET', 'OPTIONS',又或者是处于单元测试,又或者是不需要进行验证的路由,又或者token验证通过,那就会把这个token设置到cookie里去(可以使用 cookie 值来设置 X-XSRF-TOKEN 请求头,而一些 JavaScript 框架和库(如 AngularAxios)会自动将这个值添加到 X-XSRF-TOKEN 头中)。

我们再来看下是怎么验证token的。

    /*** Determine if the session and input CSRF tokens match.** @param  \Illuminate\Http\Request  $request* @return bool*/protected function tokensMatch($request){$token = $this->getTokenFromRequest($request);return is_string($request->session()->token()) &&is_string($token) &&hash_equals($request->session()->token(

这篇关于常见PHP框架CSRF防范方案分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1135169

相关文章

Knife4j+Axios+Redis前后端分离架构下的 API 管理与会话方案(最新推荐)

《Knife4j+Axios+Redis前后端分离架构下的API管理与会话方案(最新推荐)》本文主要介绍了Swagger与Knife4j的配置要点、前后端对接方法以及分布式Session实现原理,... 目录一、Swagger 与 Knife4j 的深度理解及配置要点Knife4j 配置关键要点1.Spri

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Python中win32包的安装及常见用途介绍

《Python中win32包的安装及常见用途介绍》在Windows环境下,PythonWin32模块通常随Python安装包一起安装,:本文主要介绍Python中win32包的安装及常见用途的相关... 目录前言主要组件安装方法常见用途1. 操作Windows注册表2. 操作Windows服务3. 窗口操作

ModelMapper基本使用和常见场景示例详解

《ModelMapper基本使用和常见场景示例详解》ModelMapper是Java对象映射库,支持自动映射、自定义规则、集合转换及高级配置(如匹配策略、转换器),可集成SpringBoot,减少样板... 目录1. 添加依赖2. 基本用法示例:简单对象映射3. 自定义映射规则4. 集合映射5. 高级配置匹

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

Spring 框架之Springfox使用详解

《Spring框架之Springfox使用详解》Springfox是Spring框架的API文档工具,集成Swagger规范,自动生成文档并支持多语言/版本,模块化设计便于扩展,但存在版本兼容性、性... 目录核心功能工作原理模块化设计使用示例注意事项优缺点优点缺点总结适用场景建议总结Springfox 是

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

深度解析Python装饰器常见用法与进阶技巧

《深度解析Python装饰器常见用法与进阶技巧》Python装饰器(Decorator)是提升代码可读性与复用性的强大工具,本文将深入解析Python装饰器的原理,常见用法,进阶技巧与最佳实践,希望可... 目录装饰器的基本原理函数装饰器的常见用法带参数的装饰器类装饰器与方法装饰器装饰器的嵌套与组合进阶技巧

Mysql常见的SQL语句格式及实用技巧

《Mysql常见的SQL语句格式及实用技巧》本文系统梳理MySQL常见SQL语句格式,涵盖数据库与表的创建、删除、修改、查询操作,以及记录增删改查和多表关联等高级查询,同时提供索引优化、事务处理、临时... 目录一、常用语法汇总二、示例1.数据库操作2.表操作3.记录操作 4.高级查询三、实用技巧一、常用语