wake-up-neo.net

Kodieren und dekodieren Sie den Pfadnamen in nginx

Normalerweise kann auf Dateien zugegriffen werden unter:

http://example.com/cats/cat1.Zip

Ich möchte den Pfadnamen (/cats/cat1.Zip) verschlüsseln, damit auf den Link nicht normal zugegriffen werden kann, sondern erst, nachdem der Pfadname verschlüsselt/verschlüsselt wurde:

http://example.com/Y2F0cy9jYXQxLnppcAo=

Der Einfachheit halber verwende ich die Base64-Codierung, bevorzuge jedoch die Verschlüsselung. Wie mache ich das? Muss ich ein benutzerdefiniertes Modul schreiben?

8
user3666697

Wenn Ihr einziges Anliegen darin besteht, den Zugriff auf bestimmte URLs einzuschränken, können Sie sich diesen Beitrag unter Sichern von URLs mit dem Secure ansehen Link-Modul in Nginx .

Es bietet eine recht einfache Methode zum Sichern Ihrer Dateien. Die einfachste und einfachste Methode zum Verschlüsseln Ihrer URLs ist die Verwendung der Direktive secure_link_secret:

server {

    listen 80;
    server_name example.com;

    location /cats {
        secure_link_secret yoursecretkey;
        if ($secure_link = "") { return 403; }


        rewrite ^ /secure/$secure_link;
    }


    location /secure {
        internal;
        root /path/to/secret/files;
    }
}

Die URL für den Zugriff auf die Datei cat1.Zip Lautet http://example.com/cats/80e2dfecb5f54513ad4e2e6217d36fd4/cat1.Zip, Wobei 80e2dfecb5f54513ad4e2e6217d36fd4 Der MD5-Hash ist, der für eine Textzeichenfolge berechnet wurde, die zwei Elemente verkettet:

  1. Der Teil der URL, der dem Hash folgt, in unserem Fall cat1.Zip
  2. Der Parameter der Direktive secure_link_secret, In diesem Fall yoursecretkey

Im obigen Beispiel wird auch davon ausgegangen, dass die Dateien, auf die über die verschlüsselten URLs zugegriffen werden kann, im Verzeichnis /path/to/secret/files/secure Gespeichert sind.

Darüber hinaus gibt es eine flexiblere, aber auch komplexere Methode zum Sichern von URLs mit dem Modul ngx_http_secure_link_module Mithilfe der Direktiven secure_link Und secure_link_md5, Um den URL-Zugriff nach IP zu beschränken Adresse, Ablaufzeit der URLs etc. festlegen.

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

  1. Entschlüsselung der verschlüsselten URL auf der Nginx-Seite - Schreiben Sie Ihre eigene oder verwenden Sie ein Modul, das von einer anderen Person geschrieben wurde
  2. Behandlung der Entschlüsselung der verschlüsselten URL an einer beliebigen Stelle in Ihrer Anwendung - Verwenden Sie im Wesentlichen Nginx, um Ihre verschlüsselten URLs als Proxy für Ihre Anwendung zu verwenden, wo Sie sie entschlüsseln, und verhalten Sie sich entsprechend wie oben beschrieben @ cnst .

Beide Ansätze haben Vor- und Nachteile, letzteres ist jedoch einfacher und flexibler: Sobald Sie Ihren Proxy eingerichtet haben, müssen Sie sich weder um Nginx kümmern, noch müssen Sie ihn mit bestimmten 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 ist ein Beispiel für eine einfache Nginx/Express-Anwendung, in der Sie die Entschlüsselung in Ihrer Anwendung durchführen würden. Die Nginx-Konfiguration könnte folgendermaßen aussehen:

server {

    listen 80;
    server_name example.com;

    location /cats {
        proxy_set_header Host $http_Host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-NginX-Proxy true;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_pass http://127.0.0.1:8000;
    }

    location /path/to/secured/files {
        internal;
    }
}

und auf der Anwendungsseite (Node.js/Express) haben Sie möglicherweise etwas wie:

const express = require ('express');
const app = express();

app.get('/cats/:encrypted', function(req, res) {
  const encrypted = req.params.encrypted;

  // 
  // Your decryption logic here
  //
  const decryptedFileName = decryptionFunction(encrypted);

  if (decryptedFileName) {
    res.set('X-Accel-Redirect', `/path/to/secured/files/${decryptedFileName}`);
  } else {
    // return error
  }
});


app.listen(8000);

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 auf die URL zugegriffen werden kann (ordnungsgemäß verschlüsselt). Die gleiche Logik gilt jedoch, wenn Sie etwas anderes tun müssen.

3
van100j

Sie können eine Nginx-Umschreiberegel verwenden die URL umschreiben (von codiert nach nicht codiert). Und um Ihre Codierungslogik anzuwenden, können Sie eine benutzerdefinierte Funktion verwenden (ich habe es mit dem Perl-Modul gemacht).

Könnte so etwas sein:

 http {
  ...
    Perl_modules Perl/lib;
    ...
    Perl_set $uri_decode 'sub {
      my $r = shift;
      my $uri = $r->uri;
      $uri = Perl_magic_to_decode_the_url;
      return $uri;
    }';
    ...
    server {
    ...
      location /your-protected-urls-regex {
        rewrite ^(.*)$ $scheme://$Host$uri_decode;
      }
2
Gonzalo Matheu

Erwägen Sie, OpenResty mit Lua zu verwenden.

Lua kann in Nginx fast alles, was Sie wollen.

https://openresty.org/

https://github.com/openresty/

1
shawn

Am einfachsten wäre es, ein einfaches Backend zu schreiben (zum Beispiel mit Schnittstelle durch proxy_pass ), das den Dateinamen aus dem $uri entschlüsselt und die Ergebnisse im X-Accel-Redirect-Antwortheader bereitstellt (der proxy_ignore_headers unterliegt in nginx), die anschließend einer internal -Umleitung innerhalb von nginx (zu einem Speicherort, auf den nicht zugegriffen werden kann, ohne vorher das Backend zu durchlaufen) unterzogen werden und mit allen Optimierungen, die bereits Teil von nginx sind.

location /sec/ {
    proxy_pass http://decryptor/;
}
location /x-accel-redirect-here/ {
    internal;
    alias …;
}

Der obige Ansatz folgt der 'microservices'-Architektur, da der einzige Job Ihres Entschlüsselungsdienstes darin besteht, die Entschlüsselung und Zugriffskontrolle durchzuführen, wobei es Nginx überlässt, sicherzustellen, dass die Dateien durch die Verwendung der internen Funktionen korrekt und auf die effizienteste Art und Weise bereitgestellt werden -treated X-Accel-Redirect HTTP-Antwortheader.

1
cnst