davidecesarano / embryo-csrf
用于防止CSRF的PSR-15中间件。
dev-master
2019-01-29 16:45 UTC
Requires
- php: >=7.1
Requires (Dev)
- davidecesarano/embryo-emitter: dev-master
- davidecesarano/embryo-http: dev-master
- davidecesarano/embryo-middleware: dev-master
- davidecesarano/embryo-session: dev-master
This package is auto-updated.
Last update: 2024-09-29 05:28:06 UTC
README
A PSR-15兼容的中间件,用于防止CSRF。该中间件会检查每个POST、PATCH、PUT和DELETE请求中的CSRF令牌。令牌存储在会话请求属性中。
要求
- PHP >= 7.1
- PSR-7 http消息实现和PSR-17 http工厂实现(例如Embryo-Http)
- PSR-15 http服务器请求处理器实现(例如Embryo-Middleware)
- PSR-15会话中间件(例如Embryo-Session)
- PSR响应发射器(例如Embryo-Emitter)
安装
使用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。