presseportale/app/Http/Middleware/BlockUnusedFortifyRoutes.php
Kevin Adametz bae8347f6c security: Sicherheitsaudit 07.10.2026 (S-01–S-06) behoben, Passkeys und Zweitfaktor-Pflicht für Admins
Audit: dev/sicherheit/SICHERHEITSAUDIT-2026-10-07.md, Plan und Entscheidungen:
dev/sicherheit/ENTWICKLUNGSPLAN-SICHERHEIT-2026-10-07.md.

- S-01 Legacy-Rechnungen fremder Kunden nur mit billing:manage (auch Kundenroute).
- S-02 Kontaktzuordnung auf der Firmenanzeige verlangt companies:write, $id gesperrt.
- S-03 CompanyMembershipObserver: automatische Firmenrechte werden bei jeder
  Adress-/Zuordnungsänderung sofort neu bewertet; memberships:resync-auto.
- S-04 Passwortwechsel beendet alle anderen Sessions (PasswordChanger), Reset
  alle Sessions und offene Login-Links; Fortify PUT /user/password abgeschaltet.
  API-Tokens bleiben bestehen.
- S-05 Google: email_verified Pflicht, feste Bindung über die Provider-ID;
  Erstverknüpfung bestehender Konten außerhalb gmail/hd nur per Bestätigungslink
  in derselben Browser-Session.
- S-06 Frischer Identitätsnachweis (Passwort, App-Code, E-Mail-Code oder
  Passkey) vor E-Mail-Wechsel, erster 2FA-Einrichtung und Token-Erzeugung;
  Hinweis-Mails an die (bisherige) Kontoadresse.
- Entscheidung 5: Passkeys (Fortify, @laravel/passkeys) für alle; Super-Admins
  und Admins bestätigen die Session für den Admin-Bereich per Passkey oder
  App-Code (EnsureStrongAdminAuthentication, Notfallschalter
  AUTH_REQUIRE_STRONG_ADMIN); Reset des zweiten Faktors durch Super-Admins.

Neue Migration: create_passkeys_table. Suite 2.403 grün (1 übersprungen),
Larastan ohne Meldung.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-07 16:09:35 +00:00

49 lines
1.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;
/**
* Sperrt die Fortify-Routen zur 2FA-Verwaltung, die das Projekt nicht nutzt
* (Audit U09, Entscheidung E3/E8).
*
* Die Sicherheitsseite (customer/security) ruft die Fortify-Actions direkt
* auf und verlangt vor Deaktivierung und Recovery-Codes einen TOTP- oder
* Recovery-Code. Fortify registriert daneben eigene Routen für dieselben
* Aktionen, die nur `password.confirm` verlangen – eine bis zu drei Stunden
* alte Passwortbestätigung hätte den zweiten Faktor ersetzt. Fortify kennt
* kein Abschalten einzelner Routen (nur `ignoreRoutes()` für alle), deshalb
* hängt diese Middleware über `fortify.middleware` an allen Fortify-Routen
* und beantwortet die ungenutzten mit 404. Challenge und Passwortwechsel
* bleiben erreichbar.
*/
class BlockUnusedFortifyRoutes
{
/**
* @var list<string>
*/
public const BLOCKED_ROUTES = [
'two-factor.enable',
'two-factor.confirm',
'two-factor.disable',
'two-factor.qr-code',
'two-factor.secret-key',
'two-factor.recovery-codes',
'two-factor.regenerate-recovery-codes',
// Passkeys löscht die Sicherheitsseite mit Identitätsnachweis
// (Entscheidung 5, 07.10.2026).
'passkey.destroy',
];
public function handle(Request $request, Closure $next): Response
{
if (in_array($request->route()?->getName(), self::BLOCKED_ROUTES, true)) {
abort(404);
}
return $next($request);
}
}