当前位置:首页 > PHP

php实现csrf

2026-02-28 08:49:30PHP

PHP 实现 CSRF 防护的方法

CSRF(跨站请求伪造)是一种常见的网络攻击方式,攻击者利用用户已登录的身份,在用户不知情的情况下执行恶意操作。以下是几种在 PHP 中实现 CSRF 防护的方法:

使用 Token 验证

在表单或请求中嵌入一个随机生成的 Token,并在服务器端验证该 Token 是否匹配。

// 生成 Token 并存储到 Session
session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

// 在表单中嵌入 Token
echo '<input type="hidden" name="csrf_token" value="' . $_SESSION['csrf_token'] . '">';

// 验证 Token
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die('CSRF 验证失败');
    }
}

使用 SameSite Cookie 属性

设置 Cookie 的 SameSite 属性为 StrictLax,限制跨站请求携带 Cookie。

session_set_cookie_params([
    'samesite' => 'Strict',
    'secure' => true,
    'httponly' => true
]);
session_start();

检查 Referer 头部

验证请求的来源是否合法,但此方法不完全可靠,因为 Referer 可能被篡改或缺失。

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $referer = parse_url($_SERVER['HTTP_REFERER'], PHP_URL_HOST);
    $server = $_SERVER['HTTP_HOST'];
    if ($referer !== $server) {
        die('CSRF 验证失败');
    }
}

使用框架内置的 CSRF 防护

许多 PHP 框架(如 Laravel、Symfony)已内置 CSRF 防护功能。以 Laravel 为例:

php实现csrf

// 表单中自动生成 Token
<form method="POST" action="/example">
    @csrf
    ...
</form>

// 中间件自动验证 Token

注意事项

  • Token 应具有足够的随机性和长度,避免被猜测。
  • Token 应存储在 Session 中,而非 Cookie,防止被窃取。
  • 对于敏感操作(如修改密码、支付等),应强制使用 CSRF 防护。
  • 定期更新 Token,尤其是用户登录或权限变更时。

标签: phpcsrf
分享给朋友:

相关文章

php 实现接口

php 实现接口

PHP 实现接口的方法 在 PHP 中,接口(Interface)用于定义一组方法的规范,而不包含具体的实现。类可以实现(implement)接口,并必须实现接口中定义的所有方法。 定义接口 接口通…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

基于php的设计与实现

基于php的设计与实现

PHP 设计与实现的关键要素 环境搭建与框架选择 PHP开发需配置服务器环境(如Apache/Nginx)、PHP版本(建议7.4+)及数据库(MySQL/MariaDB)。主流框架包括Laravel…

php 实现单链表

php 实现单链表

单链表的基本概念 单链表是一种线性数据结构,由节点组成,每个节点包含数据域和指向下一个节点的指针域。链表的头节点是访问整个链表的入口。 单链表的节点类实现 在PHP中,可以通过类来定义链表节…

php 队列的实现

php 队列的实现

PHP 队列的实现方法 使用数据库实现队列 创建一个数据表存储队列任务,包含任务ID、状态、创建时间等字段。通过SQL语句实现任务的入队和出队操作。 // 入队操作 INSERT INTO queu…

php mvc实现

php mvc实现

PHP MVC 实现步骤 模型(Model)层 模型负责数据处理和业务逻辑,通常与数据库交互。创建一个基类模型,其他具体模型继承它。 class Model { protected $db;…