psecio / csrf
CSRF令牌生成库
1.0
2016-01-08 21:52 UTC
Requires
- php: >=5.3.1
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方法进行双提交处理。