PHP 中的 CSRF 保护

php 中的 csrf 保护

什么是 csrf?

跨站请求伪造 (csrf) 是一种网络安全漏洞,攻击者可以利用该漏洞诱骗经过身份验证的用户在他们当前登录的网站上执行不需要的操作。该攻击通过利用网站所拥有的信任来进行在用户的浏览器中。

csrf 攻击如何运作

用户登录合法网站 a 并收到会话 cookie用户在仍登录 a 的情况下访问恶意网站 b网站 b 包含向网站 a 发出请求的代码浏览器自动包含会话 cookie网站 a 处理请求,认为其合法

php中的csrf保护方法

1. 使用隐藏输入的基于令牌的保护

这是最常用的方法。实现方法如下:

// in your session initialization (e.g., at login)session_start();if (empty($_session['csrf_token'])) {    $_session['csrf_token'] = bin2hex(random_bytes(32));}// in your formfunction generateformwithcsrftoken() {    return '                            ';}// in your form processingfunction validatecsrftoken() {    if (!isset($_post['csrf_token']) || !isset($_session['csrf_token']) ||        !hash_equals($_session['csrf_token'], $_post['csrf_token'])) {        die('csrf token validation failed');    }    return true;}

2. 使用自定义标头进行 csrf 保护

此方法使用带有自定义标头的 ajax 请求:

// php backendsession_start();if (empty($_session['csrf_token'])) {    $_session['csrf_token'] = bin2hex(random_bytes(32));}// validate the tokenif ($_server['request_method'] === 'post') {    $headers = getallheaders();    if (!isset($headers['x-csrf-token']) ||         !hash_equals($_session['csrf_token'], $headers['x-csrf-token'])) {        http_response_code(403);        die('csrf token validation failed');    }}// javascript frontendconst csrftoken = '';fetch('/api/endpoint', {    method: 'post',    headers: {        'x-csrf-token': csrftoken,        'content-type': 'application/json'    },    body: json.stringify(data)});

3.双重提交cookie模式

此方法涉及将令牌作为 cookie 和请求参数发送:

// set both cookie and session tokensession_start();$token = bin2hex(random_bytes(32));$_session['csrf_token'] = $token;setcookie('csrf_token', $token, [    'httponly' => true,    'secure' => true,    'samesite' => 'strict']);// validation functionfunction validatedoublesubmittoken() {    if (!isset($_cookie['csrf_token']) ||         !isset($_post['csrf_token']) ||         !isset($_session['csrf_token'])) {        return false;    }    return hash_equals($_cookie['csrf_token'], $_post['csrf_token']) &&            hash_equals($_session['csrf_token'], $_post['csrf_token']);}

4. samesite cookie 属性

现代应用程序还可以使用 samesite cookie 属性作为附加保护层:

// set cookie with samesite attributesession_start();session_set_cookie_params([    'lifetime' => 0,    'path' => '/',    'domain' => $_server['http_host'],    'secure' => true,    'httponly' => true,    'samesite' => 'strict']);

csrf 保护的最佳实践

代币生成使用加密安全的随机数生成器使令牌足够长(至少 32 字节)为每个会话生成新的代币

function generatesecuretoken($length = 32) {    return bin2hex(random_bytes($length));}

令牌验证使用时序安全的比较函数验证代币的存在和价值实施正确的错误处理

function validatetoken($usertoken, $storedtoken) {    if (empty($usertoken) || empty($storedtoken)) {        return false;    }    return hash_equals($storedtoken, $usertoken);}

表单实施包含所有形式的代币实现自动令牌注入处理令牌轮换

class csrfprotection {    public static function gettokenfield() {        return sprintf(            '',            htmlspecialchars($_session['csrf_token'])        );    }}

特定于框架的保护

许多 php 框架提供内置的 csrf 保护:

laravel 示例

// in your form@csrf// manual token generation{{ csrf_field() }}

交响乐示例

// In your form{{ csrf_token('form_name') }}

要避免的常见陷阱

不要使用可预测的标记不要将令牌存储在全局可访问的 javascript 变量中不要跳过 ajax 请求的 csrf 保护不要仅仅依赖于检查 referer 标头不要在多个表单中使用相同的令牌

csrf 保护对于 web 应用程序安全至关重要。虽然实现 csrf 保护的方法有多种,但使用隐藏表单字段的基于令牌的方法仍然是使用最广泛、最可靠的方法。请记住结合不同的保护方法以增强安全性,并在 php 应用程序中实施 csrf 保护时始终遵循安全最佳实践。

请记住,csrf 保护应该是更广泛的安全策略的一部分,其中包括适当的会话管理、安全 cookie 处理和输入验证。

立即学习“PHP免费学习笔记(深入)”;

以上就是PHP 中的 CSRF 保护的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1251937.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月9日 23:34:14
下一篇 2025年12月8日 09:08:34

相关推荐

  • PHP ews:构造函数属性提升

    构造函数属性提升 是 php 8 中引入的一项功能,可简化类中的属性声明和初始化。在 php 8 之前,您必须显式声明类属性,然后在构造函数中初始化它们。通过此功能,您可以直接在构造函数的参数列表中声明和初始化属性,从而减少样板代码。 传统语法(php 8 之前) class product { p…

    好文分享 2025年12月9日
    000
  • 基于 JSON 结构创建 WordPress 插件选项

    有一天,我想知道如何让 wordpress 插件选项由 json 文件控制,以便将来可以更轻松地添加其他设置,而无需调整代码本身。 本文提供了一个极其简单的 wordpress 插件示例,该插件的单个设置页面由 2 个部分和 3 个字段/选项组成。 完整代码可以在github上找到。 设置基地 该插…

    2025年12月9日 好文分享
    000
  • 如何修复 Laravel 中的目标类不存在错误

    当 laravel 无法找到所引用的类时,通常会发生“目标类不存在”错误,特别是在涉及依赖注入或服务容器绑定的情况下。 常见原因: 控制器或模型文件中的命名空间不正确。服务容器绑定未正确注册。自动加载缓存已过时。 分步解决方案:1.检查类命名空间确保文件中的命名空间与文件夹结构匹配。 // exam…

    2025年12月9日
    000
  • 代码气味 – 未解析的元标签

    不完整的元标签是不专业的 tl;dr:不完整或空元标记会破坏功能和用户体验。 问题 标签出现在输出中电子邮件文本包含人类可读文本之间的占位符丢失的占位符会让用户感到困惑网站呈现奇怪的字符空值会触发错误潜在的安全注入漏洞 解决方案 验证元标记尽早断言完整性快速失败避免空值抛出有意义的异常自动元验证 语…

    2025年12月9日 好文分享
    000
  • 编写高质量的测试

    不幸的是,测试在许多组织中仍然没有得到应有的关注。有时,如果开发人员没有编写任何测试,他们会感到内疚,同时测试代码往往没有得到适当的审查。相反,评论中经常检查的唯一事情是是否有任何测试,这是一种耻辱,因为仅仅进行测试还不够好。实际上,它们至少应该与项目中的所有其他代码具有相同的质量,即使不是更高的质…

    2025年12月9日
    000
  • PHP:我应该嘲笑还是应该走?

    简而言之模拟 模拟旨在测试真实对象的行为。 它们模拟依赖关系,因此您不必调用可能显着减慢单元测试速度的外部资源。 您可以定义期望并验证它们。 例如,您可以确保某个方法被调用特定次数和/或使用某些参数: use phpunitframeworktestcase;class mytest extends…

    2025年12月9日
    000
  • Symfony 监控库实现

    在过去的几个月里,我投入了大量精力来改进 symfony 开发人员的监控体验。 symfony 监控库是 inspector 客户中第二受欢迎的库。第一个是 laravel 包。 最新版本框架的发布带来了让应用监控体验变得前所未有的简单的机会。 在本文中,我将详细介绍这些更改是什么,以及它们对您在 …

    2025年12月9日
    000
  • 通过直接 AWS Lambda 调用简化内部 API

    这是文档的改进和完善版本:通过直接 aws lambda 调用简化内部 api 使用面向服务的架构 (soa) 系统时,您可能需要一个内部 api 来进行服务之间的通信。一种常见的方法是将 aws lambda 与 api 网关结合使用。然而,对于内部 api,有一个更简单、更高效的选择:直接调用 …

    2025年12月9日
    000
  • 可修剪的雄辩模型

    自 laravel 8.5 以来,框架中添加了一个特征,允许您根据日期修剪模型。这个trait 称为 illuminatedatabaseeloquentprunable,它允许您根据日期修剪模型。 当您想要根据日期删除模型时,此特征非常有用。例如,您可能有一个模型存储日志,并且您想要删除早于特定日…

    2025年12月9日
    000
  • 如何在没有任何插件的情况下创建 WordPress 自定义登录弹出模式

    登录第 1 步:创建 cusom 登录表单短代码: // custom sign in popup form shortcodfunction custom_login_form() { // display the login form ob_start(); ?> *user name *…

    2025年12月9日
    000
  • 最小惊讶原则(POLA)

    关键概念 1. 一致的方法命名 // bad – inconsistent namingclass usermanager { public function getuser($id) { /* … */ } public function fetchrole($id) { /* … */ …

    2025年12月9日
    000
  • 关注点分离 (SoC)

    关键实施示例 1. 数据库层分离 // bad – mixed concernsclass user { public function save() { $db = new pdo(‘mysql:host=localhost;dbname=app’, ‘user’, ‘pass’); $stmt …

    2025年12月9日 好文分享
    000
  • 为什么 Laravel 是现代 Web 应用程序的首选框架

    您的项目的成功取决于您选择的框架。人们可能很容易对众多可用的替代方案感到不知所措。不过,laravel 是一个不断脱颖而出的框架。无论项目有多复杂,laravel 都已成为现代 web 开发的首选框架。 但为什么它变得如此出名呢?让我们来看看是什么因素促使 laravel 成为全球开发者的热门选择。…

    2025年12月9日
    000
  • 将数据更新到 MySQL 数据库

    通过 PHP 函数 mysql_query 执行 SQL UPDATE 语句,可以将数据更新到 MySQL 表中。下面是一个将记录更新到员工表中的简单示例。要更新任何表中的记录,需要使用条件子句来定位该记录。下面的示例使用主键来匹配员工表中的记录。 示例 尝试以下示例来了解更新操作。您需要提供员工 …

    2025年12月9日
    000
  • Dockerize 您的 PHP 和 MySQL 应用程序:多容器应用程序分步指南

    在现代软件开发领域,容器化已成为高效部署和可扩展性的基石。 docker 可以轻松地将应用程序及其依赖项打包到可移植容器中。在本博客中,我们将引导您使用 docker compose 创建多容器 php 和 mysql 应用程序。 为什么对 php 和 mysql 使用 docker? 一致性:在开…

    2025年12月9日
    000
  • Dockerize CodeIgniter 分步指南

    在这篇博文中,我们将介绍如何对 codeigniter 3 应用程序进行 docker 化。在本指南结束时,您将拥有一个使用 apache、php 和 mysql 运行的容器化应用程序,所有这些都通过 docker compose 进行管理。这种方法将简化您的开发环境并确保跨多个系统的设置一致。 先…

    2025年12月9日
    000
  • PHP MongoDB 连接

    Php提供了mongodb驱动程序来连接mongoDB数据库。安装完成后,我们就可以使用php.ini来进行数据库操作了。这里,我们使用 Ubuntu 16.04 创建一个示例。该示例包括以下步骤。 1) 安装驱动程序 $ pecl 安装 mongodb   2) 编辑php.ini 文件 它存储在…

    2025年12月9日 好文分享
    000
  • 2025 年 10 大 PHP REST API 框架

    PHP 框架是预先编写的代码库、工具和最佳实践的集合,它们提供了使用 PHP 编程语言构建 Web 应用程序的结构化和标准化方法。它通过提供可重用组件、预定义模板以及简化数据库处理、URL 路由和身份验证等常见任务的功能来简化开发过程。 1. Laravel 概述:Laravel 是一个功能丰富、流…

    2025年12月9日
    000
  • Docker 化一个简单的 PHP 应用程序

    对于寻求跨不同环境的一致性和可移植性的开发人员来说,容器化是游戏规则的改变者。在这篇博文中,我们将介绍一个对简单 php 应用程序进行 docker 化的实际示例。在本指南结束时,您将拥有一个可运行的 docker 容器,为基本的 php 应用程序提供服务。 概述 我们将使用 docker 容器化一…

    2025年12月9日
    000
  • 快速失败

    核心原则 故障发生后立即检测并报告,防止无效状态在系统中传播。 1. 输入验证 class userregistration { public function register(array $data): void { // validate all inputs immediately $thi…

    2025年12月9日
    000

发表回复

登录后才能评论
关注微信