CsrfMiddleware.php 893 B

1234567891011121314151617181920212223242526272829
  1. <?php
  2. declare(strict_types=1);
  3. namespace Glacier\Middleware;
  4. use Glacier\Core\Logger;
  5. use Glacier\Core\Response;
  6. use Glacier\Core\Session;
  7. /**
  8. * CSRF 中间件:写方法(POST/PUT/PATCH/DELETE)校验 Token。
  9. * Token 来源:表单字段 csrf_token 或请求头 X-CSRF-Token。
  10. */
  11. final class CsrfMiddleware
  12. {
  13. public function handle(array $params = []): void
  14. {
  15. $method = strtoupper($_SERVER['REQUEST_METHOD'] ?? 'GET');
  16. if (!in_array($method, ['POST', 'PUT', 'PATCH', 'DELETE'], true)) {
  17. return; // 读方法放行
  18. }
  19. $token = $_POST['csrf_token'] ?? ($_SERVER['HTTP_X_CSRF_TOKEN'] ?? '');
  20. if (!Session::csrfCheck((string) $token)) {
  21. Logger::warning('csrf check failed', ['method' => $method, 'path' => $_SERVER['REQUEST_URI'] ?? '/']);
  22. Response::text('CSRF 校验失败', 403);
  23. }
  24. }
  25. }