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?
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:
cat1.Zip
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:
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.
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;
}
Erwägen Sie, OpenResty mit Lua zu verwenden.
Lua kann in Nginx fast alles, was Sie wollen.
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.