Den Pfadnamen in nginx codieren und dekodieren

8

Normalerweise kann auf Dateien unter:

zugegriffen werden

Ссылка

Ich möchte den Pfadnamen (/cats/cat1.zip) verschlüsseln / verschlüsseln, so dass die Verbindung normalerweise nicht zugänglich ist, aber zugänglich ist, nachdem der Pfadname verschlüsselt / codiert wurde:

Ссылка

Ich verwende die base64-Codierung zur Vereinfachung, würde aber eine Verschlüsselung bevorzugen. Wie mache ich das? Muss ich ein benutzerdefiniertes Modul schreiben?

    
user3666697 22.12.2017, 05:11
quelle

4 Antworten

3

Wenn Sie nur den Zugriff auf bestimmte URLs einschränken möchten, können Sie sich diesen Beitrag zum Sichern von URLs mit dem Secure Link-Modul in Nginx .

Es bietet eine recht einfache Methode zum Sichern Ihrer Dateien - die einfachste und einfachste Möglichkeit zum Verschlüsseln Ihrer URLs besteht in der Verwendung der secure_link_secret -Direktive:

%Vor%

Die URL für den Zugriff auf die cat1.zip -Datei wird http://example.com/cats/80e2dfecb5f54513ad4e2e6217d36fd4/cat1.zip sein, wobei 80e2dfecb5f54513ad4e2e6217d36fd4 der MD5-Hash ist, der für eine Textzeichenfolge berechnet wird, die zwei Elemente verkettet:

  1. Der Teil der URL, der auf den Hash folgt, in unserem Fall cat1.zip
  2. Der Parameter für die secure_link_secret -Direktive, in diesem Fall yoursecretkey

Das obige Beispiel geht davon aus, dass die über die verschlüsselten URLs zugänglichen Dateien im Verzeichnis /path/to/secret/files/secure gespeichert sind.

Zusätzlich gibt es eine flexiblere, aber auch komplexere Methode, um URLs mit ngx_http_secure_link_module -Modul zu sichern, indem Sie die Direktiven secure_link und secure_link_md5 verwenden, um den URL-Zugriff nach IP-Adresse zu begrenzen, Ablaufzeit von definieren die URLs usw.

Wenn Sie Ihre URLs vollständig verdecken müssen (einschließlich des cat1.zip -Teils), müssen Sie eine Entscheidung treffen zwischen:

  1. Verarbeiten der Entschlüsselung der verschlüsselten URL auf der Nginx-Seite - Schreiben Ihrer eigenen oder Wiederverwendung eines von jemand anderem geschriebenen Moduls
  2. Verarbeiten der Entschlüsselung der verschlüsselten URL irgendwo in Ihrer Anwendung - im Grunde verwenden Sie Nginx, um Ihre verschlüsselten URLs an Ihre Anwendung weiterzugeben, wo Sie sie entschlüsseln und entsprechend handeln, wie @cnst" schreibt oben.

Beide Ansätze haben Vor-und Nachteile, aber IMO letzteres ist einfacher und flexibler - sobald Sie Ihren Proxy eingerichtet haben, müssen Sie sich nicht viel Gedanken über Nginx machen, noch müssen Sie es mit einigen speziellen Voraussetzungen kompilieren; Es ist nicht erforderlich, Code in einer anderen Sprache zu schreiben oder zu kompilieren, als Sie bereits in Ihrer Anwendung geschrieben haben (es sei denn, Ihre Anwendung enthält Code in C, Lua oder Perl).

Hier sehen Sie ein Beispiel für eine einfache Nginx / Express-Anwendung, in der Sie die Entschlüsselung in Ihrer Anwendung durchführen. Die Nginx-Konfiguration könnte wie folgt aussehen:

%Vor%

und auf der Seite der Anwendung (Node.js / Express) haben Sie vielleicht etwas wie:

%Vor%

Im obigen Beispiel wird davon ausgegangen, dass sich die gesicherten Dateien im Verzeichnis /path/to/secured/files befinden. Außerdem wird davon ausgegangen, dass Sie die Dateien zum Herunterladen senden, wenn die URL zugänglich ist (richtig verschlüsselt), aber die gleiche Logik würde gelten, wenn Sie etwas anderes tun müssen.

    
van100j 07.01.2018 00:58
quelle
1

Am einfachsten wäre es, ein einfaches Backend zu schreiben (mit Schnittstellen zum Beispiel über proxy_pass ), das den Code entschlüsseln würde Dateiname aus $uri und liefert die Ergebnisse innerhalb des Headers X-Accel-Redirect response (der proxy_ignore_headers in nginx unterliegt ), die anschließend einer internal Weiterleitung innerhalb von nginx (an einen Ort, auf den nicht zugegriffen werden kann, ohne das Backend zu durchlaufen) unterliegen zuerst), und diente mit allen Optimierungen, die bereits Teil von Nginx sind.

%Vor%

Der obige Ansatz folgt der "Microservices" -Architektur, da die einzige Aufgabe Ihres Entschlüsselungsdienstes darin besteht, die Entschlüsselung und Zugriffskontrolle durchzuführen und es nginx zu überlassen, um sicherzustellen, dass die Dateien korrekt und auf die effizienteste Weise durch die Verwendung von der interne speziell behandelte X-Accel-Redirect HTTP-Antwortheader.

    
cnst 04.01.2018 22:17
quelle
1

Erwägen Sie, etwas wie OpenResty mit Lua zu verwenden.

Lua kann in nginx fast alles machen, was du willst.

Ссылка

Ссылка

    
shawn 06.01.2018 19:18
quelle
1

Sie können eine Nginx-Rewrite-Regel verwenden, die die URL umschreibt (von encodiert zu uncoded) . Und um Ihre Codierungslogik anzuwenden, können Sie eine benutzerdefinierte Funktion verwenden (ich habe es mit dem Modul perl ).

Könnte so etwas sein:

%Vor%     
Gonzalo Matheu 06.01.2018 21:58
quelle

Tags und Links