davidecesarano/embryo-csrf

用于防止CSRF的PSR-15中间件。

dev-master 2019-01-29 16:45 UTC

This package is auto-updated.

Last update: 2024-09-29 05:28:06 UTC


README

A PSR-15兼容的中间件,用于防止CSRF。该中间件会检查每个POST、PATCH、PUT和DELETE请求中的CSRF令牌。令牌存储在会话请求属性中。

要求

安装

使用Composer

$ composer require davidecesarano/embryo-csrf

用法

Embryo\CSRF\CsrfMiddleware添加到中间件分发器

use Embryo\Http\Emitter\Emitter;
use Embryo\Http\Server\RequestHandler;
use Embryo\Http\Factory\{ServerRequestFactory, ResponseFactory};
use Embryo\CSRF\CsrfMiddleware;

$request    = (new ServerRequestFactory)->createServerRequestFromServer();
$response   = (new ResponseFactory)->createResponse();
$session    = new Session;
$middleware = new RequestHandler;
$emitter    = new Emitter;

// example: generate form input
class GenerateInputMiddleware implements MiddlewareInterface
{
    public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    {
        $response = $handler->handle($request);
        $session  = $request->getAttribute('session');
        $token    = $session->get('csrf_token');
        return $response->write('<input type="hidden" name="csrf_token" value="'.end($token).'">');
    }
}

// SessionMiddleware
$middleware->add(
    (new SessionMiddleware)
        ->setSession($session)
        ->setOptions([
            'use_cookies'      => false,
            'use_only_cookies' => true
        ])
);

// CsrfMiddleware
$middleware->add(CsrfMiddleware::class);

// GenerateInputMiddleware
$middleware->add(GenerateInputMiddleware::class);

$response = $middleware->dispatch($request, $response);

$emitter->emit($response);

您可以通过内置的PHP服务器快速测试,访问https://:8000

$ cd example
$ php -S localhost:8000

选项

setSessionRequestAttribute(string $sessionRequestAttribute)

设置会话请求属性。如果没有提供,则使用$request->getAttribute('session')

setFormInputName(string $formInputName)

设置表单输入名称。如果没有提供,则使用csrf_token

setSessionKey(string $sessionKey)

设置会话键。如果没有提供,则使用$session->get('csrf_token')

setLimit(int $limit)

设置存储在会话中的令牌数量限制。如果没有提供,默认为5