Ich habe eine Anwendung geschrieben in angularjs und einem Dropwizard-Backend. Alle API-Aufrufe sind Ajax, mit Ausnahme von Dateidownloads, was durch eine Weiterleitung an eine Standard-GET-Anfrage erfolgt. Alle API-Aufrufe sind durch ein Token gesichert, das als Token-Header übergeben wird. Wir verwenden SSL für alle APIs. Die Download-GET-Anfrage funktioniert, aber es fällt mir schwer, herauszufinden, wie ich sie sichern kann. Ich habe keine Möglichkeit, einen benutzerdefinierten Header festzulegen, der zum Übergeben des Tokens erforderlich ist. Theoretisch bleiben mir zwei Optionen übrig, von denen keine akzeptabel sind: 1. Übergeben Sie den Token als einen der GET-Parameter. 2. Lassen Sie den Download ungesichert. Irgendwelche Ideen, wie man Dateidownload sichert?Wie sichere Datei herunterladen?
Antwort
Das Einfügen eines geheimen Tokens in einen URL-Abfrageparameter ist nicht gut, da URL tendenziell leakable sein kann, z. B. durch Verlauf/Logging/Referrer. Es gibt Möglichkeiten, dies zu mindern: Sie könnten beispielsweise die Server-Seite ein Download-Token ausstellen lassen, das nur für eine einzige Verwendung oder für eine begrenzte Zeit geeignet ist. Oder der Client könnte ein zeitlich begrenztes Token übergeben, das mit einer Signatur über das geheime Token erstellt wurde, das die Serverseite verifizieren könnte.
Alternativ könnte man, nur für diese eine Schnittstelle (zB pfadbegrenzt, quickckly-expiring) das Token in einen Cookie setzen.
Ein anderer Ansatz besteht darin, die gesamte Datei über AJAX herunterzuladen, so dass Sie die Kopfzeile wie gewohnt einstellen können. Dann müssen Sie den Inhalt als eine herunterladbare lokale Ressource präsentieren, die einen Cocktail von browserspezifischen Hacks erfordert (z. B. unter Verwendung von Daten: oder Dateisystem: URLs und möglicherweise Verbindungen mit dem Attribut download
). Angesichts der Komplikation lohnt es sich normalerweise nicht, sich damit zu befassen, besonders wenn die Datei sehr groß ist, was weitere Speicherbeschränkungen darstellen kann.
Ich mag die Idee eines zeitlich begrenzten Token. So wie ich es sehe Es wäre nur für ein paar Sekunden gültig. Dem Download-Aufruf würde ein GetDownloadToken-Aufruf vorangehen, der durch ein reguläres Token geschützt wäre. –