resonantcore / anti-csrf
v2.3.0
2020-12-03 14:37 UTC
Requires
- php: ^7|^8
- paragonie/constant_time_encoding: ^2
Requires (Dev)
- phpunit/phpunit: ^7|^8|^9
- vimeo/psalm: ^1|^3|^4
README
动机
目前还没有好的基于会话的CSRF防护库。这里的“好”指的是
- CSRF令牌可以限制以下任意或所有
- 特定会话
- 特定的HTTP URI
- 特定的IP地址(可选)
- 可以存储多个CSRF令牌
- CSRF令牌使用一次后即过期
- 对存储在会话数据中的令牌数量设置上限
- 在我们的实现中,最老的令牌首先被移除
警告 - 不要在任何将所有$_SESSION
数据存储在客户端cookie中的项目中使用。这会很快耗尽HTTP cookie的4KB存储上限。
在任何项目中使用它
参见autoload.php
以获取SPL自动加载器。
与Twig模板一起使用
首先,添加一个类似以下的过滤器
use \ParagonIE\AntiCSRF\AntiCSRF; $twigEnv->addFunction( new \Twig_SimpleFunction( 'form_token', function($lock_to = null) { static $csrf; if ($csrf === null) { $csrf = new AntiCSRF; } return $csrf->insertToken($lock_to, false); }, ['is_safe' => ['html']] ) );
接下来,从模板中调用新创建的form_token函数。
<form action="/addUser.php" method="post"> {{ form_token("/addUser.php") }} {# ... the rest of your form here ... #} </form>
验证请求
$csrf = new \ParagonIE\AntiCSRF\AntiCSRF; if (!empty($_POST)) { if ($csrf->validateRequest()) { // Valid } else { // Log a CSRF attack attempt } }
支持合同
如果贵公司在其产品或服务中使用此库,您可能对从Paragon Initiative Enterprises购买支持合同感兴趣。