psecio/csrf

CSRF令牌生成库

1.0 2016-01-08 21:52 UTC

This package is auto-updated.

Last update: 2024-09-15 10:15:09 UTC


README

跨站请求伪造(CSRF)令牌为您的请求提交提供保护,以确保它们来自您的应用程序。PHP中最常见的实现是使用当前会话来存储令牌值,并在表单提交后进行一次比较。这个库通过默认为您处理这个常见任务来简化这个过程。

  • 通过OpenSSL或PHP 7的csprng提供有效的随机令牌生成
  • 处理数据提交后的会话存储和评估。

以下是一个使用示例

<?php
require_once 'vendor/autoload.php';

$manager = new \Psecio\Csrf\Manager();

if (isset($_POST['sub'])) {
    $result = $manager->verify($_POST['csrf-token']);
    if ($result === false) {
        echo 'Bad token! Shame on you...';
    }
}
?>

<form action="/csrf/index.php" method="POST">
    <input type="submit" value="submit" name="sub"/>
    <input type="hidden" name="csrf-token" value="<?php echo $manager->generate(); ?>"/>
</form>
?>

如你所见,有三个主要部分

  • Manager 实例
  • 调用generate方法创建和存储令牌
  • 调用verify方法检查提交的令牌与存储的内容是否匹配

库存储令牌的方式是创建一个唯一的哈希值,然后以此作为键存储令牌。这防止了只能存储一个令牌的情况,如果同一应用程序打开多个标签页,将导致错误。

双提交令牌

在Web应用安全中还有一个概念叫做双提交cookie,其中CSRF值既作为cookie发送,也作为POST数据的一部分。这个cookie被设置为HTTP Only,这意味着没有JavaScript可以访问cookie值,从而防止像跨站脚本(XSS)攻击这样的窃取。

要启用此Csrf库的自动双提交功能,只需将true传递给Manager构造函数

<?php
$manager = new \Psecio\Csrf\Manager(true);
?>

这就完成了 - 存储和评估cookie的过程包含在验证过程中,以及存储在会话中的值。

使用自己的存储方法扩展

Manager类还包括一个可选参数,允许您定义自己的存储方法,如果默认的会话方法不适用于您的应用程序。您只需定义一个扩展\Psecio\Csrf\Storage类的类,并将其作为第二个参数传递。

<?php

class DbStorage
{
    public function save($key, $code)
    {
        // Save to the database here...
    }
    public abstract function get($key)
    {
        // Read from the database here
    }
    public abstract function delete($key)
    {
        // Delete from the database here
    }
}
$dbStorage = new DbStorage();
$manager = new Manager(false, $dbStorage);

?>

然后Csrf库将使用此存储方法代替会话方法。注意:如果您将第一个参数更改为true,它仍然会使用cookie方法进行双提交处理。