Files
awo-hamburg-intranet/module/tasks/lib/Csrf.php
Moritz Weinmann 743476f64a Module tasks + knowledgecenter_update aus Kundenprojekt übernehmen (bereinigt)
Beide Module wurden aus einem anderen Kundenprojekt kopiert und bereinigt:

Knowledgecenter:
- Bild-Cache (1.985 Dateien) geleert, Ordnerstruktur mit .gitkeep behalten
- Files-Gallery-Lizenzschlüssel entfernt (config.php)
- Kundenspezifische Kategorien gelöscht: Teil I/II/III QM-Struktur,
  nummerierte QM-Kapitel, Gremien (Präsidium/Finanzausschuss/Landesausschuss),
  Sitzungsservice-Serie, Protokoll-Abteilungen, Testeinträge
- 56 generische Kategorien bleiben (Downloads, Onboarding, Personalthemen …)

Tasks:
- Alle Betriebsdaten gelöscht (114 Tasks, 914 Submissions, 579 Assignments)
- Task-Definitionen und Verlinkungen geleert
- Kategoriestruktur bleibt (Allgemein, IT, Personal, Buchhaltung …)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-06-22 09:20:02 +02:00

48 lines
1.2 KiB
PHP

<?php
declare(strict_types=1);
class TaskCertCsrf
{
private const TOKEN_KEY = 'task_cert_csrf_token';
public static function token(): string
{
if (empty($_SESSION[self::TOKEN_KEY])) {
$_SESSION[self::TOKEN_KEY] = bin2hex(random_bytes(32));
}
return (string) $_SESSION[self::TOKEN_KEY];
}
public static function hiddenInput(): string
{
return '<input type="hidden" name="csrf_token" value="' . TaskCertView::e(self::token()) . '">';
}
public static function validate(?string $token): bool
{
if ($token === null || $token === '') {
return false;
}
$sessionToken = (string) ($_SESSION[self::TOKEN_KEY] ?? '');
if ($sessionToken === '') {
return false;
}
return hash_equals($sessionToken, $token);
}
public static function assertValidFromRequest(bool $jsonResponse = true): void
{
$token = TaskCertRequest::postString('csrf_token');
if ($token === '') {
$token = (string) ($_SERVER['HTTP_X_CSRF_TOKEN'] ?? '');
}
if (!self::validate($token)) {
TaskCertResponse::error('CSRF validation failed', 419, $jsonResponse);
}
}
}