当前位置:首页 > PHP

php实现csrf

2026-01-29 11:36:22PHP

PHP 实现 CSRF 防护的方法

CSRF(跨站请求伪造)是一种常见的网络攻击方式,攻击者通过伪造用户的请求来执行非预期的操作。在 PHP 中可以通过以下方法实现 CSRF 防护:

生成 CSRF Token

在用户会话开始时生成一个唯一的 Token,并将其存储在 Session 中:

session_start();
if (empty($_SESSION['csrf_token'])) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
}

在表单中嵌入 Token

将生成的 Token 嵌入到表单中,作为隐藏字段:

<form action="process.php" method="post">
    <input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
    <!-- 其他表单字段 -->
    <input type="submit" value="提交">
</form>

验证 CSRF Token

php实现csrf

在处理表单提交时,验证 Token 是否匹配:

session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die('CSRF 验证失败');
    }
    // 验证通过,处理表单数据
}

AJAX 请求中的 CSRF 防护

对于 AJAX 请求,可以将 Token 放在请求头中:

var xhr = new XMLHttpRequest();
xhr.open('POST', 'process.php', true);
xhr.setRequestHeader('X-CSRF-Token', '<?php echo $_SESSION['csrf_token']; ?>');
xhr.send(formData);

然后在 PHP 中验证:

php实现csrf

if ($_SERVER['HTTP_X_CSRF_TOKEN'] !== $_SESSION['csrf_token']) {
    die('CSRF 验证失败');
}

Token 过期机制

可以设置 Token 的有效期,增加安全性:

if (empty($_SESSION['csrf_token_expire']) || time() > $_SESSION['csrf_token_expire']) {
    $_SESSION['csrf_token'] = bin2hex(random_bytes(32));
    $_SESSION['csrf_token_expire'] = time() + 3600; // 1小时后过期
}

同源策略检查

检查请求的来源是否与预期一致:

$allowedOrigins = ['https://yourdomain.com'];
if (isset($_SERVER['HTTP_ORIGIN']) && !in_array($_SERVER['HTTP_ORIGIN'], $allowedOrigins)) {
    die('非法请求来源');
}

这些方法可以有效地防护 CSRF 攻击,建议根据实际需求组合使用。

标签: phpcsrf
分享给朋友:

相关文章

php实现分页

php实现分页

PHP实现分页的基本方法 使用原生PHP实现分页功能需要结合数据库查询和HTML展示。以下是核心实现步骤: 数据库查询与分页逻辑 // 连接数据库 $conn = new mysqli('loca…

php实现搜索功能

php实现搜索功能

实现基础搜索功能 使用PHP和MySQL实现基础的搜索功能需要结合表单提交与数据库查询。创建一个HTML表单用于接收用户输入的搜索关键词,通过PHP处理表单数据并查询数据库。 // 搜索表单 (HT…

php实现登录

php实现登录

PHP 登录功能实现 数据库连接与用户表创建 创建一个数据库连接文件 db.php,用于管理数据库连接。MySQL 示例代码如下: <?php $host = 'localhost'; $db…

php验证码实现

php验证码实现

验证码实现方法 在PHP中实现验证码功能通常涉及生成随机字符串或数字,将其转换为图像,并通过会话(Session)进行验证。以下是几种常见的实现方式: 使用GD库生成图像验证码 GD库是PHP内置的…

php实现的分页

php实现的分页

PHP 实现分页的方法 基本分页逻辑 分页的核心在于计算总页数、当前页码以及数据偏移量。假设每页显示 10 条数据: $current_page = isset($_GET['page']) ? (…

php实现注册登录

php实现注册登录

PHP 注册功能实现 创建数据库表(以 MySQL 为例) CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, usern…