Ziel dieser Seite
Wenn ein zeitlich begrenzter Freigabelink genau die bei der Ausstellung festgelegten Bedingungen verwenden soll, genügt es nicht, die Signatur der URL zu prüfen. Sie müssen außerdem einheitlich festlegen, woher Sie die Werte lesen. Diese Seite erläutert das an einem Beispiel, das Berichtstyp und Ausgabeformat in die URL aufnimmt und JSON für eine Vorschau zurückgibt. Die Seite bezieht sich auf Laravel 13. Allgemeines zur URL-Erzeugung finden Sie unter URL-Generierung, die Grundlagen zum Abrufen von Eingaben unter HTTP-Requests.Was die Signatur schützt
input() ist eine API, die nicht nur den Query-String, sondern auch den Body verarbeitet. Beim Zusammenführen dieser Eingaben gibt Laravel den Werten aus dem Body Vorrang vor denen aus dem Query-String.
query() liest dagegen ausschließlich den Query-String.
Dass die Signaturprüfung erfolgreich war und dass ein danach gelesener Wert signiert ist, sind zwei getrennte Prüfpunkte.
Einen zeitlich begrenzten Vorschaulink implementieren
1. Die zu prüfende Route definieren
Definieren Sie inroutes/web.php eine benannte Route, die eine Signatur voraussetzt.
Das Beispiel greift weder auf die Datenbank noch auf Dateien zu, sondern gibt nur die empfangenen Bedingungen zurück.
- Die Middleware
signedprüft Signatur und Ablaufzeit, bevor die Closure ausgeführt wird. Ist eines davon ungültig, gibt sie403zurück. - Mit
query()lesen Sie die für die Verarbeitung verwendeten Werte explizit aus dem Query-String. - Die Validierung erfolgt auf dem abgerufenen Array. Die Signaturprüfung garantiert weder den Typ der Werte noch fachlich zulässige Bereiche.
In diesem Beispiel werden an
Validator::make() nur die mit query() ausgelesenen Werte übergeben.
Ersetzen Sie sie an einer Stelle, die signierte Query-Werte validieren soll, durch $request->all(), verarbeiten Sie Eingaben einschließlich des Bodys.2. Die URL in einem vertrauenswürdigen Ausstellungsprozess erzeugen
Nachdem die benannte Route registriert ist, verwenden Sie im Prozess, der die Links ausstellt, folgenden Code. Dareport und format keine Platzhalter im Pfad sind, werden sie an den Query-String angehängt.
expires und signature.
expires und signature sind reservierte Parameter, die Laravel verwendet. Nutzen Sie sie daher nicht als Namen für eigene fachliche Parameter.
Wenn Sie den Ausstellungsprozess in einer echten Anwendung öffentlich zugänglich machen, darf nicht jeder Links mit beliebigen Bedingungen ausstellen können. Sorgen Sie für die nötige Authentifizierung und Autorisierung.
3. Die normale Nutzung prüfen
Öffnen Sie die ausgestellte URL unverändert innerhalb der Gültigkeitsdauer, wird folgendes JSON zurückgegeben.signed der Route 403 zurück.
Signierte URLs sind keine Einmal-Tokens. In diesem Beispiel lässt sich dieselbe URL innerhalb der Gültigkeitsdauer erneut verwenden.
Soll ein Link nur einmal nutzbar sein, müssen Sie den Nutzungsstatus unabhängig von der Signatur verwalten.
Von der Prüfung ausgenommene Werte trennen
Möchten Sie etwa vom Frontend hinzugefügte Seitenzahlen zulassen, können Sie diese mithasValidSignatureWhileIgnoring(['page']) von der Signaturprüfung ausnehmen.
Ausgenommene Werte kann jedoch jeder ändern. Behandeln Sie sie daher nicht als signierte Bedingungen.
So hat beispielsweise page für die Anzeige eine andere Rolle als report und format, die bei der Ausstellung festgelegt werden.
Nehmen Sie Werte, mit denen über Zieldaten, Empfänger, Preise und Ähnliches entschieden wird, nicht allein aus Bequemlichkeit von der Prüfung aus.
Relative Signaturen verwenden
Soll die Domain nicht Teil der Signatur sein, kombinieren Sieabsolute: false bei der Erzeugung mit signed:relative bei der Prüfung.
middleware('signed') der obigen Route in middleware('signed:relative').
Auch bei relativen Signaturen wird der Body nicht signiert. Am Abrufen mit query() ändert sich daher nichts.
Checkliste für die Implementierung
- Die empfangende Route setzt eine Signaturprüfung voraus.
- Signierte Query-Werte werden mit
query()abgerufen. - Format und zulässiger Bereich der Werte werden separat validiert.
- Von der Signaturprüfung ausgenommene Werte werden nicht als bei der Ausstellung festgelegte Bedingungen verwendet.
- Die Einstellungen für absolute und relative Signaturen stimmen auf erzeugender und prüfender Seite überein.
- Die Kenntnis der URL wird nicht mit den Berechtigungen des angemeldeten Benutzers gleichgesetzt.
Verwandte Seiten und Primärquellen
- URL-Generierung: APIs für signierte URLs und Reaktion auf ungültige Signaturen
- HTTP-Requests: Eingabewerte und Query-Strings abrufen
- Validierung: Eingabeformat und zulässige Werte validieren
- Offizielle Laravel-Dokumentation: Signed URLs
- Offizielle Laravel-Dokumentation: Retrieving input from the query string
- Laravel Framework: UrlGenerator
- Laravel Framework: ValidateSignature