66 lines
1.8 KiB
PHP
66 lines
1.8 KiB
PHP
<?php
|
|
namespace Blog\Middleware;
|
|
|
|
use Blog\Middleware\MiddlewareInterface;
|
|
use Blog\Http\Request;
|
|
use Blog\Http\Response;
|
|
|
|
/**
|
|
* Middleware zur Authentifizierung und CSRF-Prüfung.
|
|
*
|
|
* Prüft, ob ein Benutzer eingeloggt ist und ob ein gültiges CSRF-Token vorliegt.
|
|
*/
|
|
class AuthMiddleware implements MiddlewareInterface {
|
|
/**
|
|
* Führt die Authentifizierungs- und CSRF-Prüfung durch.
|
|
*
|
|
* @param Request $request Das aktuelle Request-Objekt
|
|
* @param Response $response Das aktuelle Response-Objekt
|
|
* @return bool true, wenn die Anfrage fortgesetzt werden darf, sonst false
|
|
*/
|
|
public function handle(Request $request, Response $response): bool {
|
|
if(!isset($_SESSION['user'])) {
|
|
$response
|
|
->setStatus(403)
|
|
->getBody()
|
|
->write("403 - Forbidden")
|
|
->send();
|
|
return false;
|
|
}
|
|
|
|
if($request->getMethod() !== 'GET' && !$this->validateCSRFToken($request)) {
|
|
$response
|
|
->setStatus(419)
|
|
->getBody()
|
|
->write("419 - Session expired or invalid CSRF token.")
|
|
->send();
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Prüft, ob das CSRF-Token gültig ist.
|
|
*
|
|
* @param Request $request Das aktuelle Request-Objekt
|
|
* @return bool true, wenn das Token gültig ist, sonst false
|
|
*/
|
|
public static function validateCSRFToken(Request $request): bool {
|
|
$token = $request->getPost('_csrf_token') ?? '';
|
|
return hash_equals($_SESSION['_csrf_token'] ?? '', $token);
|
|
}
|
|
|
|
/**
|
|
* Generiert und gibt ein CSRF-Token zurück.
|
|
*
|
|
* @return string Das generierte oder vorhandene CSRF-Token
|
|
*/
|
|
public static function generateCSRFToken(): string {
|
|
if(!isset($_SESSION['_csrf_token'])) {
|
|
$_SESSION['_csrf_token'] = bin2hex(random_bytes(32));
|
|
}
|
|
return $_SESSION['_csrf_token'];
|
|
}
|
|
}
|