ocramius/psr7-csrf

此包已被弃用且不再维护。作者建议使用psr7-sessions/storageless包。

2.0.0 2018-01-28 16:33 UTC

This package is auto-updated.

Last update: 2022-02-01 12:56:38 UTC


README

Build Status Scrutinizer Code Quality Code Coverage Packagist Packagist

PSR7Csrf是一个PSR-7中间件,它为基于PSR-7的应用程序提供了CSRF保护。

5.0.0+版本已弃用,推荐使用psr7-sessions/storageless

请注意,此包已弃用

psr7-sessions/storageless 5.0.0以来,默认情况下生成的cookie对不安全的HTTP方法(如POSTPUTDELETEPATCH等)具有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());

此设置将要求任何非GETHEADOPTIONS的请求都应在请求体参数(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许可证下公开发布。