chiron / csrf
给它一个漂亮的描述!
1.0.9
2021-11-27 10:39 UTC
Requires
- php: ^8.0|^8.1
- chiron/cookies: ^1.0
- chiron/core: ^1.0
- chiron/http: ^1.1
- chiron/security: ^1.0
Requires (Dev)
- chiron/coding-standard: ^3.0
- nyholm/psr7: ^1.3
- phpstan/phpstan: ^0.12
- phpstan/phpstan-phpunit: ^0.12
- phpunit/phpunit: ^9.5
README
PSR15 中间件,用于保护您的应用程序免受 跨站请求伪造 的攻击
此中间件使用 Cookie 存储每个 "不安全" 请求(POST
/ PUT
/ PATCH
/ DELETE
)中用于比较的令牌。
为什么?
因为。
安装
$ composer require chiron/csrf
要激活扩展
[ //... XXX\CsrfBootloader::class, ]
该扩展将激活 Chiron\Csrf\Middleware\CsrfTokenMiddleware
以为每个用户请求颁发唯一令牌。
启用特定路由的保护
该扩展提供了一个中间件 CsrfProtectionMiddleware
,该中间件会在您的路由(特定路由或所有路由)上激活保护。此中间件将保护所有针对 "不安全" 方法 POST
、PUT
、PATCH
、DELETE
的请求。
use Chiron\Csrf\Middleware\CsrfProtectionMiddleware; // ... public function boot(RouterInterface $router) { $route = new Route('/', new Target\Action(HomeController::class, 'index')); $router->setRoute( 'index', $route->withMiddleware(CsrfProtectionMiddleware::class) ); }
启用所有路由的保护
要激活所有路由上的 CSRF 保护,您需要通过 MiddlewareQueue
"全局" 注册 Chiron\Csrf\Middleware\CsrfProtectionMiddleware
。
use Chiron\Csrf\Middleware\CsrfProtectionMiddleware; // ... public function boot(MiddlewareQueue $middlewares) { $middlewares->addMiddleware(CsrfProtectionMiddleware::class); }
使用方法
一旦激活了保护,您必须使用通过 PSR-7 属性 csrfToken
可用的令牌对每个请求进行签名。
在控制器或视图中接收此令牌
public function index(ServerRequestInterface $request) { $csrfToken = $request->getAttribute('csrfToken'); }
用户的每个 POST
/ PUT
/ PATCH
/ DELETE
请求都必须包含此令牌作为 POST 参数 csrf-token
或头部 X-CSRF-Token
。
如果缺少令牌,用户将收到错误 403 禁止
。
如果令牌被篡改(并且将删除 Cookie),用户将收到错误 412 前置条件失败
。
public function index(ServerRequestInterface $request) { $form = ' <form method="post"> <input type="hidden" name="csrf-token" value="{csrfToken}"/> <input type="text" name="value"/> <input type="submit"/> </form> '; $form = str_replace( '{csrfToken}', $request->getAttribute('csrfToken'), $form ); return $form; }
待办事项
- 在 "csrf_token()" 辅助函数上添加文档。
- 创建一个 TwigExtension 类以添加 csrf_token。