展开菜单
首页 精品内容 本月促销 装机必备 Windows macOS软件 IOS软件 Android AI PDF教程 专题
全部分类

当前位置:

首页 > 编程开发 > PHP实现CSRF防护的Token验证方法

PHP实现CSRF防护的Token验证方法

最核心的CSRF防护方案是基于Token的生成与验证机制,服务器在表单中嵌入与用户会话绑定的随机Token,并在提交时验证其一致性;2.Token需使用random_bytes()等加密安全函数生成,存储于$_SESSION中,避免使用可预测的rand()等函数;3.Token必须通过隐藏字段嵌入表单,并使用htmlspecialchars()防止XSS导致泄露;4.提交时需比对$_POST中的Token与$_SESSION中的Token,不一致则拒绝请求;5.验证成功后应立即销毁或重新生成Token,防

最核心的CSRF防护方案是基于Token的生成与验证机制,服务器在表单中嵌入与用户会话绑定的随机Token,并在提交时验证其一致性;2. Token需使用random_bytes()等加密安全函数生成,存储于$_SESSION中,避免使用可预测的rand()等函数;3. Token必须通过隐藏字段嵌入表单,并使用htmlspecialchars()防止XSS导致泄露;4. 提交时需比对$_POST中的Token与$_SESSION中的Token,不一致则拒绝请求;5. 验证成功后应立即销毁或重新生成Token,防止重放攻击;6. 传统方法如Referer检查不可靠,因该头部可被禁用或伪造,而仅依赖POST请求也无法根本防御CSRF;7. Token机制有效在于引入了不会自动携带的“秘密”,弥补了浏览器自动发送Cookie的漏洞;8. 可结合SameSite Cookie属性(如Lax或Strict)限制跨站Cookie发送,显著降低CSRF风险;9. 对AJAX请求可验证自定义头部(如X-Requested-With),利用同源策略增强防护;10. 高风险操作应增加二次验证(如重输密码或OTP),提供额外安全层;11. 全站启用HTTPS并配置HSTS,防止中间人攻击截获Token,确保传输安全;12. 综合使用Token验证与多种辅助措施,构建多层次防御体系,全面提升CSRF防护能力。

PHP如何实现CSRF防护?Token生成验证方案

CSRF(Cross-Site Request Forgery)防护在PHP中,最核心且广泛推荐的方案是基于Token的生成与验证机制。简单来说,就是在用户每次提交敏感操作的表单时,服务器都会生成一个独一无二的、与用户会话绑定的随机字符串(即Token),将其嵌入到表单中,并同时在服务器端(通常是Session)保存一份副本。当表单提交回来时,服务器会对比提交上来的Token和Session中保存的Token是否一致。如果一致,则认为是合法请求;否则,就拒绝该请求。

解决方案

要实现PHP中的CSRF Token防护,我们需要在几个关键环节进行操作:

  1. Token的生成与存储: 在用户访问包含敏感操作的页面(例如,修改密码、删除数据)之前,或者在渲染表单时,服务器需要生成一个加密安全的随机字符串作为CSRF Token。这个Token应该足够长,且难以预测。生成后,它会被存储在用户的会话($_SESSION)中,通常以一个特定的键名(例如'csrf_token')保存。

  2. Token的嵌入: 将生成的Token作为一个隐藏字段嵌入到HTML表单中。这样,当用户提交表单时,Token就会随表单数据一起发送到服务器

    这里使用htmlspecialchars()是标准的安全实践,防止XSS攻击导致Token值被篡改或泄露。

  3. Token的验证: 当表单数据提交到服务器时(通常是POST请求),服务器需要从$_POST$_REQUEST中获取提交的Token,并与会话中存储的Token进行比对。

    销毁或重新生成Token是防止“重放攻击”(Replay Attack)的关键一步,即攻击者截获了一个有效的Token后,尝试用它来重复提交请求。

为什么传统的CSRF防御方法不够健壮?

在没有Token机制之前,人们也尝试过一些方法来对抗CSRF,但后来发现它们都有各自的局限性,或者说,不够“健壮”。在我看来,这主要是因为它们没有触及到CSRF攻击的核心——浏览器自动发送用户会话凭证(如Cookie)的这个行为。

一个常见的尝试是检查HTTP请求的Referer头部。理论上,如果请求不是从你的网站发出的,那么Referer头就不应该是你的域名。然而,这个头部是不可靠的。用户浏览器或某些代理服务器可能会禁用或修改Referer头部,导致它为空或指向其他地址。更糟糕的是,攻击者在某些情况下(例如,通过Flash或某些浏览器插件的漏洞)可以伪造Referer头部。所以,仅仅依赖Referer就像是把安全寄希望于一个不确定性因素,这在安全领域是大忌。

还有一种想法是,只对POST请求进行敏感操作,因为GET请求更容易被构造和嵌入到图片或链接中。但这仅仅是增加了攻击的难度,并没有从根本上解决问题。一个POST请求同样可以被恶意网站通过

标签构造并自动提交。而且,如果你的应用程序设计不当,将状态改变的操作放在了GET请求中,那么它将直接暴露在CSRF的风险之下,根本无需考虑POST。

归根结底,这些方法的不足在于,它们都没有解决浏览器在跨域请求中自动携带Cookie这个“根源”问题。只要Cookie被自动带上,服务器就认为请求是来自合法用户,而无法区分请求是用户自愿发起的,还是被恶意网站诱导发起的。Token机制的巧妙之处就在于,它引入了一个只有服务器和用户(通过表单)才知道的“秘密”,这个秘密不会被自动携带,需要显式地从表单中获取并验证。

在PHP中如何安全地生成和管理CSRF Token?

安全地生成和管理CSRF Token,不仅仅是生成一个随机字符串那么简单,它涉及到几个关键的安全实践和策略考量。

首先,Token的生成必须使用加密安全的随机数生成器。PHP提供了random_bytes()函数,它是生成加密安全随机字节串的首选。bin2hex()函数则将这些字节转换为十六进制字符串,方便在HTML中嵌入和传输。永远不要使用像rand()mt_rand()或简单的uniqid()来生成Token,因为它们产生的随机数是可预测的,攻击者可能通过猜测或暴力破解来伪造Token。

其次,Token必须与用户的会话紧密绑定。这意味着Token应该存储在$_SESSION中,而不是Cookie或者URL参数里。存储在$_SESSION中可以确保每个用户的Token是独立的,并且不容易被其他用户窃取或猜测。如果存储在Cookie中,攻击者可能通过XSS漏洞窃取Cookie,从而获取Token。如果Token在URL中传递,它会暴露在服务器日志、浏览器历史记录和Referer头部中,增加泄露风险。

关于Token的生命周期管理,有几种策略:

  • 单次使用(One-time Token):这是最安全的策略。每次表单提交并验证成功后,立即销毁当前Token(unset($_SESSION['csrf_token'])),并为下一次请求生成一个新的Token。这可以有效防止重放攻击。缺点是,如果用户在多个浏览器标签页中打开了同一个表单,提交其中一个标签页后,其他标签页的Token就会失效,导致用户体验受损。
  • 多重Token(Token Stack):为了解决单次使用Token在多标签页场景下的问题,可以将会话中的Token存储为一个数组(一个“栈”)。每次表单提交时,检查提交的Token是否存在于这个数组中。验证成功后,从数组中移除该Token。生成新表单时,向数组中添加一个新的Token。这种方式更复杂,但提供了更好的用户体验。
  • 基于时间戳的Token:Token中可以嵌入一个时间戳,服务器在验证时除了比对Token本身,还会检查时间戳是否在有效范围内(例如,Token在5分钟内有效)。这可以防止Token被长期滥用,但需要额外的逻辑来处理时间同步和误差。

最后,确保整个应用程序都使用HTTPS。即使你的CSRF Token生成和验证逻辑是完美的,如果应用程序通过HTTP传输,Token在传输过程中仍然可能被中间人攻击者截获。HTTPS提供了端到端的加密,是保护所有敏感数据(包括CSRF Token)传输的基础。

除了Token验证,还有哪些辅助手段可以提升CSRF防护等级?

虽然Token验证是CSRF防护的核心,但在某些场景下,结合其他辅助手段可以显著提升应用程序的整体安全性,形成一个更全面的防御体系。这有点像给门上锁,单一个好锁可能够用,但多加几道保险、甚至再装个监控,总是更让人安心。

一个非常重要的辅助手段是SameSite Cookie属性。这是现代浏览器提供的一个强大功能,它允许你指定Cookie何时可以随跨站请求发送。

  • SameSite=Lax(默认值,如果未明确指定):浏览器只会随顶级导航(如点击链接)和GET请求发送Cookie。POST请求通常不会发送。这已经能防御大部分CSRF攻击。
  • SameSite=Strict:浏览器只会在同站请求中发送Cookie。跨站请求(包括点击链接)都不会发送Cookie。这是最严格的模式,安全性最高,但可能对用户体验造成影响(例如,从第三方网站点击链接回到你的网站时,用户可能需要重新登录)。
  • SameSite=None; Secure:Cookie会随所有请求发送,包括跨站请求。但它要求Cookie必须是安全的(即只能通过HTTPS发送)。这种模式通常用于需要跨站共享Cookie的场景(如OAuth回调、嵌入式内容),但它本身不提供CSRF防护,反而需要依赖其他机制(如CSRF Token)。 在PHP中设置SameSite Cookie很简单,例如:setcookie('session_id', $value, ['samesite' => 'Lax', 'secure' => true, 'httponly' => true]);

另一个值得考虑的是自定义HTTP头部验证。对于AJAX请求,你可以要求客户端在请求中包含一个自定义的HTTP头部(例如X-Requested-With: XMLHttpRequest)。由于浏览器对跨域AJAX请求有同源策略的限制,除非服务器明确允许,否则恶意网站通常无法发送带有自定义头部的跨域AJAX请求。服务器端检查这个头部是否存在且值正确。但这并非万无一失,因为一些旧浏览器或某些攻击向量可能绕过这个限制。

对于极度敏感的操作,例如修改账户密码、绑定银行卡等,可以考虑用户二次验证。这可能包括要求用户重新输入密码,或者输入通过短信/邮件发送的一次性验证码(OTP)。这虽然增加了用户操作的步骤,但为高风险操作提供了额外的安全层,即使CSRF Token被某种方式绕过,攻击者也无法完成操作。

最后,HTTP Strict Transport Security (HSTS) 也是一个间接但重要的安全增强。HSTS强制浏览器只能通过HTTPS与你的网站通信,即使用户尝试通过HTTP访问,浏览器也会自动将其重定向到HTTPS。这消除了SSL剥离攻击(SSL Stripping)的风险,确保了所有流量都是加密的,从而保护了包括CSRF Token在内的所有敏感信息在传输过程中的安全。

这些辅助手段,并非要取代Token验证,而是作为其补充,构建一个多层次的防御体系。毕竟,安全从来都不是单点突破,而是层层设防。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发
相关文章 更多
精品专题 更多
本月促销

正软商城本月促销专区,汇集办公、设计、安全、影音、系统工具及AI软件等正版软件优惠活动,提供限时折扣、特价授权和优惠购买信息,活动库存及价格以页面实时展示为准。

装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

IOS软件

正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

AI

正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
灵活计算器
灵活计算器

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

图几
图几

图几是一款适用于 macOS 的截图、标注与美化工具,支持离线操作保障隐私。界面整理和高频系统操作被放到一起考虑,桌面或窗口内容一多时,管理起来会更省心。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Menuist
Menuist

Menuist 是一款面向 macOS 的 Finder 右键菜单增强工具,主要用来补充新建文件、快捷导航等常用操作,让日常文件管理和访问路径时更高效、更顺手。

Mole
Mole

Mole 是一款专为 Mac 设计的深度清理优化工具,涵盖缓存清理、应用管理及实时状态监控等功能。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

WINDOWS 更多
Windows 10
Windows 10

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

思源笔记
思源笔记

思源笔记是一款本地笔记软件,提供所见即所得的编辑方式,为长文写作带来顺滑的体验。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

傲梅轻松备份
傲梅轻松备份

傲梅轻松备份是一款专业易用的数据备份软件,为重要数据提供安全保障。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

Office 365 简体中文
Office 365 简体中文

一款文字处理软件,一种订阅式的跨平台办公软件,基于云平台提供多种服务,通过将 Excel 和 Outlook 等应用与 OneDrive 和 Microsoft Teams 等强大的云服务相结合,Office 365 可让任何人使用任何设备随时随地创建和共享内容。

Wise Folder Hider Pro
Wise Folder Hider Pro

Wise Folder Hider Pro 是一款专业级文件和文件夹隐藏加密软件,为私密数据添加多重保护。高频操作更强调就近处理,浏览、整理和跨目录移动文件时,来回切换和重复点击都会少很多。

WALTR PRO
WALTR PRO

WALTR是一款电脑至iOS文件传输转换工具,操作简单,快速实现文件识别与传送。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

CodeExpander
CodeExpander

CodeExpander 是一款快捷短语输入增强工具,通过键入缩写自动展开为自定义文段,提升工作效率。任务管理和过程控制会更完整,持续下载、批量同步或需要稳定传输流程的场景会更适合它。

PinStack
PinStack

PinStack是一款轻量级的Windows平台剪贴板管理工具,优化您的剪贴板使用体验。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

Mountain Duck
Mountain Duck

Mountain Duck 是一款能将多个网盘挂载到本地的工具,像本地磁盘一样使用网盘。清理链路的完整性会更好一些,做应用卸载、残留处理和空间整理时,通常能少走很多手动排查步骤。

Seer
Seer

Seer是一款在Win平台下的空格键功能增强效率工具,只需轻敲空格键,就能预览几乎任何格式的文件。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。