HTTP路由实例教程(三)—— CSRF攻击原理及其防护

由 学院君 创建于5年前, 最后更新于 11个月前

版本号 #3

77487 views

92 likes

0 collects

1、什么是CSRF攻击

CSRF是跨站请求伪造(Cross-site request forgery)的英文缩写。关于CSRF攻击原理及其防护,可查看Github上的这个项目:理解CSRF,说得比较详细和透彻。

2、Laravel中如何避免CSRF攻击

Laravel框架中避免CSRF攻击很简单:Laravel自动为每个用户Session生成了一个CSRF Token,该Token可用于验证登录用户和发起请求者是否是同一人,如果不是则请求失败。

Laravel提供了一个全局帮助函数csrf_token来获取该Token值,因此只需在视提交图表单中添加如下HTML代码即可在请求中带上Token:

该段代码等同于全局帮助函数csrf_field的输出:

在Blade模板引擎中还可以使用如下方式调用:

{!! csrf_field() !!}

测试代码

我们在routes.php中定义如下代码:

Route::get('testCsrf',function(){

$csrf_field = csrf_field();

$html = <<

{$csrf_field}

GET;

return $html;

});

Route::post('testCsrf',function(){

return 'Success!';

});

在浏览器中我们输入http://laravel.app:8000/testCsrf,点击“Test”按钮,浏览器输出:

Success!

则表示请求成功,否则,如果我们定义GET路由如下:

Route::get('testCsrf',function(){

$html = <<

GET;

return $html;

});

则点击“Test”按钮,则抛出TokenMismatchException异常。

3、从CSRF验证中排除指定URL

并不是所有请求都需要避免CSRF攻击,比如去第三方API获取数据的请求。

可以通过在VerifyCsrfToken(app/Http/Middleware/VerifyCsrfToken.php)中间件中将要排除的请求URL添加到$except属性数组中:

namespace App\Http\Middleware;

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

class VerifyCsrfToken extends BaseVerifier

{

/**

* 指定从 CSRF 验证中排除的URL

*

* @var array

*/

protected $except = [

'testCsrf'

];

}

这样我们刷新页面,再次在http://laravel.app:8000/testCsrf页面中点击“Test”按钮,则页面不会报错,正常输出如下内容:

Success!

4、X-CSRF-Token及其使用

如果使用Ajax提交POST表单,又该如何处理呢?我们可以将Token设置在meta中:

然后在全局Ajax中使用这种方式设置X-CSRF-Token请求头并提交:

$.ajaxSetup({

headers: {

'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')

}

});

Laravel的VerifyCsrfToken中间件会检查X-CSRF-TOKEN请求头,如果该值和Session中CSRF值相等则验证通过,否则不通过。

5、X-XSRF-Token及其使用

除此之外,Laravel还会将CSRF的值保存到名为XSRF-TOKEN的Cookie中,然后在VerifyCsrfToken中间件验证该值,当然,我们不需要手动做任何操作,一些JavaScript框架如Angular会自动帮我们实现。

6、Laravel中CSRF验证原理分析

说了这么多使用方式,接下来我们来分析下源码,看看Laravel底层到底是如何避免CSRF攻击的:

1)首先Laravel开启Session时会生成一个token值并存放在Session中(Illuminate\Session\Store.php第90行start方法),对应源码如下:

public function start()

{

$this->loadSession();

if (! $this->has('_token')) {

$this->regenerateToken();

}

return $this->started = true;

}

2)然后重点分析VerifyToken中间件的handle方法,该方法中先通过isReading方法判断请求方式,如果请求方法是HEAD、GET、OPTIONS其中一种,则不做CSRF验证;

3)再通过shouldPassThrough方法判断请求路由是否在$excpet属性数组中进行了排除,如果做了排除也不做验证;

4)最后通过tokensMatch方法判断请求参数中的CSRF TOKEN值和Session中的Token值是否相等,如果相等则通过验证,否则抛出TokenMismatchException异常。

对应源码如下:

public function handle($request, Closure $next)

{

if ($this->isReading($request) || $this->shouldPassThrough($request) || $this->tokensMatch($request)) {

return $this->addCookieToResponse($request, $next($request));

}

throw new TokenMismatchException;

}

注:tokensMatch方法首先从Request中获取_token参数值,如果请求中不包含该参数则获取X-CSRF-TOKEN请求头的值,如果该请求头也不存在则获取X-XSRF-TOKEN请求头的值,需要注意的是X-XSRF-TOKEN请求头的值需要调用decrypt方法进行解密。

php csrf攻击教程,HTTP路由实例教程(三)—— CSRF攻击原理及其防护相关推荐

  1. matlab项目实例教程,matlab简明实例教程.doc

    matlab简明实例教程.doc 南京航空航天大学王正盛1MATLAB数学工具软件实例简明教程王正盛编写南京航空航天大学南京航空航天大学王正盛2第一章MATLAB简介MALAB译于矩阵实验室MATri ...

  2. starccm实例教程_star ccm+实例教程.pdf

    [实例简介]STAR-CCM 中文案例教程_V9.06.pdf [实例截图] [核心代码] 内容 教程指南............................................... ...

  3. awk教程入门与实例练习(三)

    在 awk 系列的这篇总结中,Daniel 向您介绍 awk 重要的字符串函数,以及演示了如何从头开始编写完整的支票簿结算程序.在这个过程中,您将学习如何编写自己的函数,并使用 awk 的多维数组.学 ...

  4. python编程实例教程-Python程序设计实例教程

    图书简介 配套资源:电子课件,习题答案,教学大纲,源代码 本书特色: ★本书共14个项目,主要包括Python编程基础.网络爬虫.数据分析和数据可视化四大部分内容. ★全部代码适用于Python 3. ...

  5. sed教程入门与实例练习(三)

    在第二篇 sed 文章中,我提供了一些示例来演示 sed 的工作原理,但是它们当中很少有示例能实际做特别有用的事.在这篇 sed 系列的最后文章中,我要改变那种方式,并使用 sed 来做实际的事.我将 ...

  6. 一起谈.NET技术,Silverlight实例教程 - Out of Browser的Debug和Notifications窗口

    Silverlight 实例教程索引 Silverlight 实例教程 - Out of Browser开篇 Silverlight 实例教程 - Out of Browser配置,安装和卸载 Sil ...

  7. 51自学网sketchup8基础教程 3dmax高级建模教程 VR产品级渲染教程 家具设计制造教程...

    我要自学网平面设计 计算机基础知识教程 Excel2010基础教程 Word2010基础教程 PPT2010基础教程 五笔打字视频教程  我要自学网Excel函数应用教程 Excel VBA基础教程 ...

  8. PHP: 手把手编写自己的 MVC 框架实例教程

    1 什么是MVC MVC模式(Model-View-Controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model).视图(View)和控制器(Controller ...

  9. Zend Framework实例教程

    Zend Framework实例教程(1) 2007-03-24 18:23:50 我们邀请PHP安全专家 - 最新版Zend Frame的贡献者 - Chris Shiflett帮我们写一篇文章介绍 ...

最新文章

  1. halcon与QT联合:(5.3)瓶盖检测以及QT界面搭建
  2. 经验分享:如何在自己的创业中,用上GPT-3等AI大模型
  3. Node.js学习之路09——Path基本介绍
  4. SecureCRT 6.7.1 注冊机 和谐 破解 补丁 方法
  5. Nginx的安装与部署
  6. C# ListView控件显示表格(自适应宽度),添加 Checkbox,删除选择项,选中颜色和鼠标滑过背景变色
  7. matlab中图像太大,图像处理:算法在MATLAB中耗时太长
  8. PHP的SAPI【web server与应用程序沟通的标准泛称】:CGI、FastCGI 【web server与应用程序的具体标准】及其对应程序PHP-CGI PHP-FPM【具体的程序应用】
  9. mesageflow 集成spider 开发思路 手稿
  10. pythonrandom库seed_Python
  11. 不相交集类及其应用生成迷宫
  12. react设置static defaultProps报错问题解决
  13. VBA打开TXT类文件读写相关操作代码
  14. MFC初步教程(二)
  15. App Crash 详解
  16. 指数函数以及对数函数的导数
  17. 基于pandas实现K折交叉验证数据集划分
  18. 五问补盲(四)| 好用的补盲激光雷达,得满足哪些条件?
  19. 初识Python必看基础知识~ 续(3)
  20. UEFI Drivers UEFI Driver Model

热门文章

  1. 比特币挖矿成本表_用算力趋势预测减半后比特币挖矿成本价
  2. 2017.3.7 搞笑世界杯 失败总结
  3. barbuttonitem 文字换行_ios开发 常用代码整理
  4. python中xlrd.open_workbook_python解决open()函数、xlrd.open_workbook()函数文件名包含中文,sheet名包含中文报错的问题...
  5. python两列相乘_python – Pandas group by和sum两列
  6. windows 笔记本连接公共wifi不弹出登录页面的处理办法
  7. 通过Keepalived实现Redis Failover自动故障切换功能
  8. python 强类型 弱类型_强类型、弱类型
  9. Linux打印介绍【转贴】
  10. MySQL复制中slave延迟监控