ocramius / psr7-csrf
Requires
- php: ^7.1.0
- lcobucci/jwt: ^3.2.2
- psr/http-message: ^1.0.1
- psr/http-server-handler: ^1.0.0
- psr/http-server-middleware: ^1.0.0
- psr7-sessions/storageless: ^4.0.0
Requires (Dev)
- humbug/humbug: ^1.0.0-rc.0
- phpunit/phpunit: ^6.5.5
- squizlabs/php_codesniffer: ^2.6.0
This package is auto-updated.
Last update: 2022-02-01 12:56:38 UTC
README
PSR7Csrf是一个PSR-7中间件,它为基于PSR-7的应用程序提供了CSRF保护。
5.0.0+版本已弃用,推荐使用psr7-sessions/storageless
请注意,此包已弃用。
自psr7-sessions/storageless
5.0.0以来,默认情况下生成的cookie对不安全的HTTP方法(如POST
、PUT
、DELETE
、PATCH
等)具有CSRF防护能力,因此不再需要此包。您仍然可以安装ocramius/psr7-csrf
,但由于没有实际需要,因此没有必要这样做。
这是关于什么的?
PSR7Csrf不是在会话中存储令牌,而是简单地使用JWT令牌,这些令牌可以单独进行验证、签名并具有特定的有效期。
这种无存储的方法可以避免从会话或数据库中加载令牌,并简化整个UI工作流程:令牌在其签名和过期日期有效期间始终有效。
安装
composer require ocramius/psr7-csrf
使用
最简单的用法是基于默认设置。它假设您有一个配置好的PSR-7兼容应用程序,该应用程序支持管道中间件,并且还需要您运行PSR7Session。
在一个zendframework/zend-expressive
应用程序中,设置如下所示
$app = \Zend\Expressive\AppFactory::create(); $app->pipe(\PSR7Session\Http\SessionMiddleware::fromSymmetricKeyDefaults( 'mBC5v1sOKVvbdEitdSBenu59nfNfhwkedkJVNabosTw=', // replace this with a key of your own (see PSR7Session docs) 1200 // 20 minutes session duration )); $app->pipe(\PSR7Csrf\Factory::createDefaultCSRFCheckerMiddleware());
此设置将要求任何非GET
、HEAD
或OPTIONS
的请求都应在请求体参数(JSON或URL编码)中包含一个csrf_token
。
您可以为任何表单生成CSRF令牌,如下所示
$tokenGenerator = \PSR7Csrf\Factory::createDefaultTokenGenerator(); $app->get('/get', function ($request, $response) use ($tokenGenerator) { $response ->getBody() ->write( '<form method="post" action="/post">' . '<input type="submit"/>' . '<input type="hidden" name="csrf_token" value="' . $tokenGenerator($request) . '"/>' . '</form>' ); return $response; }); $app->post('/post', function ($request, $response) { $response ->getBody() ->write('It works!'); return $response; });
示例
composer install # install at the root of this package first! cd examples composer install php -S localhost:9999 index.php
然后尝试访问http://localhost:9999
:您应该看到一个简单的提交表单。
如果您尝试修改提交的CSRF令牌(它在隐藏的表单字段中),则POST请求将失败。
已知限制
请参阅PSR7Session的已知限制。
此外,此组件不能防止双重表单提交:它仅防止第三方CSRF攻击。只要CSRF令牌有效,就可以在多个请求中重复使用它。
贡献
请参阅贡献说明。
许可证
此项目在MIT许可证下公开发布。