CsrfMiddleware.php 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. <?php
  2. namespace App\Middlewares\Web;
  3. use App\Utils\Csrf;
  4. use PH7\JustHttp\StatusCode;
  5. class CsrfMiddleware
  6. {
  7. /*
  8. * Genera un token contra ataques CSRF para
  9. * los formularios de la aplicación.
  10. */
  11. public function generate($req, $res)
  12. {
  13. // Genera el token contra CSRF.
  14. $token = Csrf::generateToken($req->path);
  15. $req->session['csrf_token'] = $token;
  16. /*
  17. * Se pasa la variable $req->app->local('csrf_token')
  18. * dentro de los controladores y middlewares
  19. * con el token contra ataques CSRF.
  20. */
  21. $req->app->local('csrf_token', $token);
  22. }
  23. /*
  24. * Comprueba un token contra ataques CSRF de un formulario.
  25. */
  26. public function verify($req, $res)
  27. {
  28. // Token generado por la aplicación.
  29. $token = $req->session['csrf_token'] ?? '';
  30. // Elimina el token generado por la aplicación.
  31. unset($req->session['csrf_token']);
  32. // Token del formulario.
  33. $test = $req->body['csrf_token'] ?? '';
  34. // Comprueba la autenticación del token del formulario.
  35. if (empty($token) || empty($test) || !Csrf::verify($token, $test)) {
  36. $res->sendStatus(StatusCode::BAD_REQUEST);
  37. }
  38. }
  39. }