当前位置:首页 > PHP

原生php实现csrf

2026-02-15 16:07:30PHP

原生 PHP 实现 CSRF 防护

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

生成 CSRF Token

在会话中生成一个唯一的令牌,并将其嵌入表单或请求中:

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

在表单中嵌入 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

session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    if (!isset($_POST['csrf_token']) || $_POST['csrf_token'] !== $_SESSION['csrf_token']) {
        die('CSRF 验证失败');
    }
    // 处理合法请求
}

为 AJAX 请求添加 Token

对于 AJAX 请求,可以将令牌添加到请求头中:

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

服务器端验证:

原生php实现csrf

if ($_SERVER['HTTP_X_CSRF_TOKEN'] !== $_SESSION['csrf_token']) {
    http_response_code(403);
    exit;
}

令牌刷新策略

每次使用后刷新令牌可以增强安全性:

// 验证成功后刷新令牌
unset($_SESSION['csrf_token']);
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));

同源检查

补充检查请求来源可以增加防护:

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

设置 Cookie 的 SameSite 属性

通过设置 Cookie 的 SameSite 属性可以防止 CSRF:

session_set_cookie_params([
    'lifetime' => 0,
    'path' => '/',
    'domain' => '.yourdomain.com',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Strict'
]);
session_start();

这些方法可以单独使用,但组合使用会提供更强的安全性。实现时需根据具体应用场景选择适合的方案。

标签: phpcsrf
分享给朋友:

相关文章

php实现下载

php实现下载

PHP实现文件下载 使用PHP实现文件下载可以通过设置HTTP头部信息强制浏览器下载文件而非直接打开。以下是几种常见的方法: 方法一:直接输出文件内容 $file_path = 'path/to/…

无限分类实现 php

无限分类实现 php

无限分类的实现方法 无限分类通常用于构建多层级结构的数据,如商品分类、部门架构等。以下是几种常见的实现方式: 邻接列表模式(Adjacency List) 邻接列表是最简单的实现方式,通过在每个记录…

php https实现

php https实现

PHP 中实现 HTTPS 的方法 在 PHP 中实现 HTTPS 主要通过配置服务器和编写代码来确保通信的安全性。以下是几种常见的方法: 配置服务器支持 HTTPS 确保服务器已安装 SSL/T…

php 实现md5

php 实现md5

使用 PHP 内置函数实现 MD5 PHP 提供了 md5() 函数,可以直接计算字符串的 MD5 哈希值。该函数接受一个字符串参数,返回 32 字符的十六进制哈希值。 $string = "H…

php实现扫码登录

php实现扫码登录

PHP 实现扫码登录的方案 扫码登录通常基于以下流程:用户访问网页生成二维码(含唯一标识),手机扫码后确认登录,服务器验证并完成登录状态同步。以下是具体实现方法: 生成二维码与唯一标识 使用 PHP…

php 实现 java md5加密

php 实现 java md5加密

PHP 实现 Java MD5 加密 Java 和 PHP 的 MD5 加密结果可能存在差异,主要由于字符编码和输出格式的不同。以下是确保 PHP 与 Java MD5 加密结果一致的方法。 确保字…