PHP-实例-CSRF

1 需求

按照用途分类:

  • 会话(会话ID和会话令牌 二选一)
    • 会话ID:服务器侧自动生成,自动存储在cookie中,需要在服务器侧存储
    • 会话令牌:服务器侧手动生成,手动存储在cookie中,不需要再服务器侧存储
  • CSRF
    • CSRF令牌:

按照存储位置分类:

  • 服务器侧
    • $_SESSION
  • 浏览器侧
    • cookie
    • 隐藏控件

2 语法


3 示例

在 PHP 中,防范 CSRF(跨站请求伪造)攻击的一种常见方法是使用令牌(token)验证。这个令牌通常是一个随机生成的字符串,它在表单提交时与用户的会话(session)相关联。下面是一个简单的 PHP 示例,演示了如何防范 CSRF 攻击:

  1. 生成 CSRF 令牌

在会话开始时,生成一个随机的 CSRF 令牌并将其存储在会话中。

session_start();// 生成 CSRF 令牌
if (!isset($_SESSION['csrf_token'])) {
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}
  1. 在表单中包含 CSRF 令牌

在 HTML 表单中,将 CSRF 令牌作为隐藏字段或作为请求头的一部分包含在内。

<form action="submit.php" method="post">
<!-- 其他表单字段 --><!-- CSRF 令牌作为隐藏字段 -->
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>"><!-- 提交按钮 -->
<button type="submit">Submit</button>
</form>

或者,你可以使用 JavaScript 将 CSRF 令牌作为请求头的一部分发送:

// 假设你已经在某处将 CSRF 令牌存储在 JavaScript 变量中
var csrfToken = '...'; // 从 cookie、localStorage 或其他地方获取// 使用 AJAX 发送请求时,将 CSRF 令牌作为请求头的一部分发送
$.ajax({
url: 'submit.php',
type: 'POST',
data: { /* 其他数据 */ },
headers: {
'X-CSRF-Token': csrfToken
},
success: function(response) {
// 处理响应
}
});
  1. 验证 CSRF 令牌

在服务器端,验证接收到的 CSRF 令牌是否与会话中的令牌匹配。

session_start();
// 检查是否提交了 CSRF 令牌
if (isset($_POST['csrf_token']) && $_POST['csrf_token'] === $_SESSION['csrf_token']) {
// CSRF 令牌验证成功,处理表单数据
// ...
} else {
// CSRF 令牌验证失败,可能是 CSRF 攻击
// 可以采取相应的措施,如记录日志、返回错误消息等
die('Invalid CSRF token.');
}

如果你使用的是 AJAX 请求并通过请求头发送 CSRF 令牌,你可以在服务器端通过 $_SERVER['HTTP_X_CSRF_TOKEN'] 来获取它并进行验证。

请注意,这只是一个简单的示例,用于说明如何防范 CSRF 攻击。在实际应用中,你可能还需要考虑其他安全措施,如使用 HTTPS 来加密通信、限制请求的来源等。


4 参考资料

CSRF 令牌(通常称为 CSRF token)通常是在用户会话(session)开始时生成,并在整个会话期间保持不变。这意味着,在用户的单个会话中,CSRF 令牌是唯一的并且相同的,但不同的用户会话或不同的浏览器会话会有不同的 CSRF 令牌。

这是 CSRF 令牌的一个典型实现方式:

  1. 当用户首次访问受保护的页面或应用时,服务器会为该用户会话生成一个随机的 CSRF 令牌,并将其存储在会话数据(如 PHP 的 $_SESSION)中。
  2. 同时,服务器会将这个 CSRF 令牌嵌入到发送到客户端的页面中,通常是通过一个隐藏的表单字段或者 cookie。
  3. 当用户提交表单时,客户端会将 CSRF 令牌包含在请求中(通常是通过表单字段或自定义的 HTTP 请求头)。
  4. 服务器在接收到请求时,会检查请求中的 CSRF 令牌是否与会话数据中的令牌匹配。如果匹配,则继续处理请求;如果不匹配,则拒绝请求,并可能记录一个安全事件。

由于 CSRF 令牌是在会话开始时生成的,并且通常在整个会话期间保持不变,因此服务器可以在多个请求之间验证相同的 CSRF 令牌。这样可以确保只有知道当前会话 CSRF 令牌的用户(即同一浏览器的同一用户会话)才能提交有效的表单请求。

然而,值得注意的是,有些实现可能会选择在每次请求时都生成新的 CSRF 令牌。虽然这可以提供更高的安全性(因为即使 CSRF 令牌在某个时间点被泄露,它也会在很短时间内失效),但它也会增加实现的复杂性,并可能导致一些额外的问题(如需要在多个页面之间传递和同步 CSRF 令牌)。因此,在大多数情况下,每个会话一个 CSRF 令牌是足够安全的,并且更容易实现和管理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/41606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7月07日,每日信息差

第一、6 月份&#xff0c;北京、上海、广州和深圳的新建商品住宅成交量分别环比增加 21%、66%、48% 和 38%&#xff0c;均创年内新高 第二、2024 年世界人工智能大会上&#xff0c;上海向四家企业发放了首批无驾驶人智能网联汽车示范应用许可&#xff0c;这些企业可以在浦东部…

Redis源码整体结构

一 前言 Redis源码研究为什么先介绍整体结构呢?其实也很简单,作为程序员的,要想对一个项目有快速的认知,对项目整体目录结构有一个清晰认识,有助于我们更好的了解这个系统。 二 目录结构 Redis源码download到本地之后,对应结构如下: 从上面的截图可以看出,Redis源码一…

52-5 内网代理2 - LCX端口转发(不推荐使用LCX)

环境搭建: 本地开3台虚拟机:kali(必须)、windows2012与2008 (可换成其他windows虚拟机) kali - 网络配置成桥接模式 windows2012 - 设置两个网卡,NAT与桥接模式 注意:windows2012要关闭防火墙,要不然其他主机ping不通 关闭防火墙后再开启远程桌面连接 windwos20…

去O化神器 Exbase

随着去O化进程推动&#xff0c;很多旧业务依赖的oracle数据库&#xff0c;都需要实现做数据库的替换&#xff0c;当下能很好兼容Oracle&#xff0c;并实现异构数据库之间转换的工具并不多。这里给大家推荐一个商业工具数据库迁移工具exbase&#xff08;北京海量&#xff09;&am…

昇思MindSpore 25天学习打卡营|day18

DCGAN生成漫画头像 在下面的教程中&#xff0c;我们将通过示例代码说明DCGAN网络如何设置网络、优化器、如何计算损失函数以及如何初始化模型权重。在本教程中&#xff0c;使用的动漫头像数据集共有70,171张动漫头像图片&#xff0c;图片大小均为96*96。 GAN基础原理 这部分原…

想知道你的电脑能不能和如何升级RAM吗?这里有你想要的一些提示

考虑给你的电脑增加更多的RAM,但不确定从哪里开始?本指南涵盖了有关升级Windows PC或笔记本电脑中RAM的所有信息。 你需要升级RAM吗 在深入研究升级RAM的过程之前,评估是否需要升级是至关重要的。你是否经历过系统滞后、频繁的BSOD错误或应用程序和程序突然崩溃?这些症状…

从零开始的python学习生活

pycharm部分好用快捷键 变量名的定义 与之前学习过的语言有所不同的是&#xff0c;python中变量名的定义更加的简洁 such as 整形。浮点型和字符串的定义 money50 haha13.14 gaga"hello"字符串的定义依然是需要加上引号&#xff0c;也不需要写&#xff1b;了 字符…

Django 常见的操作符

在filter() 方法&#xff0c;exclude() 方法中使用大于&#xff0c;小于&#xff0c;模糊匹配等操作符。 常见的操作符如下&#xff1a; 操作符含义示例等于Book.objects.filter(price10)! 或 __ne不等于用于查找字段不等于特定值的记录。但更常用exclude()方法。__gt大于用于…

React Redux使用@reduxjs/toolkit的hooks

关于redux的学习过程需要几个官网&#xff0c;有redux官网&#xff0c;React Redux官网和Redux Toolkit的官网。 其中后者的中文没有找到&#xff0c;不过其中的使用在React Redux官网的快速入门中有介绍。 现在一般不使用connect借接口了。 对于借助Redux Toolkit的React Redu…

Linux GUN(gcc/g++) 版本升级教程

Linux gcc/g 升级命令: // 查看当前安装的版本 ll /usr/bin/gcc* ll /usr/bin/g*// 更新源 sudo apt update // 安装新版本 sudo apt install g-10 gcc-10 // 应用新的版本 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 10 sudo update-altern…

【网站推荐】Developer Roadmaps 开发者学习路线

你是否想学习某门技术而苦苦找不到学习路线。本文推荐一个网站&#xff0c;解决学习路径问题。 roadmap.sh 旨在创建路线图、指南和其他教育内容&#xff0c;以帮助指导开发人员选择路径并指导他们的学习。 技术路线包括了前端后端安卓iosUI设计等内容&#xff0c;一些技术比如…

信息安全三要素

文章目录 安全三要素 CIA机密性完整性可用性参考资料 安全三要素 CIA 安全三要素&#xff0c;也被称为信息安全的CIA三要素&#xff0c;是确保信息和系统安全的核心原则。它们分别是&#xff1a; 机密性&#xff08;Confidentiality&#xff09;&#xff1a;保护数据不能泄露…

antdesignvue对话框用户可移动并缩放

原贴 轻松搞定Ant Design Modal对话框拖拽缩放 - ByteZoneX社区https://www.bytezonex.com/archives/IFRuoJhd.html Ant Design 模态对话框&#xff1a;实现拖拽缩放功能 **子 Ant Design 是一个流行的前端 UI 框架&#xff0c;提供了一系列实用的组件&#xff0c;包括模态对…

ESP32CAM物联网教学02

ESP32CAM物联网教学02 物联网门锁 小智来到姑姑家门口&#xff0c;按了门铃&#xff1b;还在公司上班的姑姑用电脑给小智开了门&#xff0c;让他先进屋休息。小智对物联网门锁产生了兴趣&#xff1a;什么是物联网&#xff1f;为什么这么厉害&#xff1f; 初识物联网 我们在百…

andboxie-Plus - 知名沙盒软件、支持游戏多开测试软件

我们经常会需要用到一些毒瘤软件——它们可能不是真正的恶意软件&#xff0c;但总爱偷摸干一些流氓行为。 工作中&#xff0c;有时还不得不安装使用一些来路不明、不能完全信任的可疑软件。 装上吧&#xff0c;心里膈应、难受&#xff1b;不装吧&#xff0c;有些工作又进行不…

代码随想录算法训练营第五十八天|KMC101 孤岛的总面积、KMC102 沉没孤岛、KMC103 水流问题

题1&#xff1a; 指路&#xff1a;101. 孤岛的总面积 (kamacoder.com) 思路与代码&#xff1a; 本题要求找到不靠边的陆地面积&#xff0c;那么我们从地图的最外层开始遍历&#xff0c;找到靠近四个边的陆地&#xff0c;通过搜索将周边靠陆地且相邻的陆地1变成海洋0&#xf…

【驱动篇】龙芯LS2K0300之PWM设备驱动

实验目的 利用脉冲调制效应&#xff08;PWM&#xff09;等效改变输出功率大小控制LED&#xff0c;从而实现呼吸灯效果&#xff0c;需要用到RGB LED模块 模块连接 IO 插针接口上一共集成了两路PWM&#xff0c;分别是PWM2和PWM3&#xff0c;对应GPIO88、GPIO89 PWM2和PWM3对…

期末考试结束,老师该如何私发成绩?

随着期末考试的落幕&#xff0c;校园里又恢复了往日的宁静。然而&#xff0c;对于老师们来说&#xff0c;这并不意味着工作的结束&#xff0c;相反&#xff0c;一系列繁琐的任务才刚刚开始。 成绩单的发放&#xff0c;就是其中一项让人头疼的工作。家长们焦急地等待着孩子的考试…

Python程序打包成EXE文件指南

本套课在线学习视频&#xff08;网盘地址&#xff0c;保存到网盘即可免费观看&#xff09;&#xff1a; ​​https://pan.quark.cn/s/57ba5f313c5b​​ 将Python程序打包成可执行文件&#xff08;EXE&#xff09;可以方便用户在没有Python环境的计算机上运行程序。本文将详细…

【Linux】在线求助命令--help,man page , info page

我们知道Linux有很多的命令&#xff0c;那LInux要不要背命令&#xff1f; 答案是背最常用的那些就行了 那有的时候我们想查询一些命令的详细用法该怎么办呢&#xff1f; 这里我给出3种方法 1.--help --help的使用方法很简单啊 要查询的命令 --help 我们看个例子 这里我只…