23 Stimmen

NGINX unescapes %2f zu einem Schrägstrich. Wie kann ich das verhindern?

Angenommen, ich möchte einen Artikeltitel in einer URL kodieren, die einen Schrägstrich enthält. Wenn ich den Artikeltitel in der URL kodiere, erhalte ich:

http://example.com/articles/foo%2fbar/view/

NGINX übergibt dies an meine FastCGI-Anwendung als:

http://example.com/articles/foo/bar/view/

Das macht die Idee ziemlich zunichte.

Ich stelle fest, dass NGINX eine Datei, z. B. /path/to/page.html, über eine der beiden folgenden URLs erreicht werden kann:

http://example.com/path/to/page.html
http://example.com/path/to%2fpage.html

Dies gilt jedoch nicht für (beispielsweise) den Apache.

Gibt es eine Möglichkeit, dieses Verhalten zu beheben?

Ich habe die Dokumente und Google ausprobiert, ohne Erfolg.

Danke.

UPDATE

nginx-Konfiguration:

worker_processes  1;
pid ./nginx.pid;
events {
    worker_connections  1024;
}
http {
    server_tokens off;
    server {
        listen 80;
        server_name localhost;
        location /mysite/{
            fastcgi_pass   unix: ./mysite.fcgi.socket;

            fastcgi_param SERVER_NAME $server_name;
            fastcgi_param SERVER_PORT $server_port;
            fastcgi_param SERVER_PROTOCOL $server_protocol;
            fastcgi_param SCRIPT_NAME "/mysite/";
            fastcgi_param PATH_INFO $fastcgi_path_info;
            fastcgi_param REQUEST_METHOD $request_method;
            fastcgi_param QUERY_STRING $query_string;
            fastcgi_param CONTENT_TYPE $content_type;
            fastcgi_param CONTENT_LENGTH $content_length;
            fastcgi_pass_header Authorization;
            fastcgi_intercept_errors off;
        }
    }

}

2voto

Dayo Punkte 11933

Versuchen Sie, "%" als "%25" zu entschlüsseln.

http://example.com/articles/foo%252fbar/view/

2voto

cnst Punkte 23716

Weitere Einzelheiten zu diesem Thema finden Sie unter Nginx pass_proxy Unterverzeichnis ohne Url-Dekodierung die eine vollständige Lösung bietet, wenn Sie ein _proxy_pass_ Benutzer.

Con _fastcgi_pass_ kann dies aufgrund der Standardeinstellungen geschehen. conf/fastcgi.conf in nginx, wo die DOCUMENT_URI wird die Variable http://nginx.org/r/$document_uri , was gleichbedeutend ist mit http://nginx.org/r/$uri , die wiederum die normalisierte (dekodierte und unescapte), abfragelose und möglicherweise umgeschriebene Version von http://nginx.org/r/$anforderung_uri (auf die wiederum über REQUEST_URI stattdessen):

  fastcgi_param  REQUEST_URI        $request_uri;
  fastcgi_param  DOCUMENT_URI       $document_uri;

In Ihrem Fall scheinen Sie jedoch nicht zu spezifizieren DOCUMENT_URI überhaupt nicht, da http://nginx.org/r/fastcgi_param wird nicht von einer früheren Ebene geerbt, wenn es auf der aktuellen Ebene verwendet wird, so dass es möglich ist, dass der entschlüsselte Pfad aus Ihrer http://nginx.org/r/$fastcgi_pfad_info , die mit folgenden Elementen gepaart werden soll http://nginx.org/r/fastcgi_split_path_info die Sie in der bereitgestellten Konfiguration weggelassen haben, so dass die ursprüngliche Frage widersprüchlich erscheinen mag, da die genauen Pfade zwischen den bereitgestellten Anforderungen und der Beispielkonfiguration ebenfalls nicht übereinstimmen.

Unabhängig davon ist die beste Lösung mit fastcgi hängt von der Anwendung ab und kann eine der folgenden Möglichkeiten sein:

  • Nicht von Pfaden abhängen, die von nginx nicht richtig decodiert und bereinigt werden. Dies ist wahrscheinlich die beste Lösung in Bezug auf die Sicherheit, da Sie nginx im Grunde bitten, Dinge wie /../ (einschließlich aller escaped-Varianten), was sicherlich dazu dient, Sie vor einer ganzen Reihe von Schwachstellen in Ihrem Backend zu schützen.
  • Neugestaltung der gesamten Schnittstelle zur Verwendung der Abfrageparameter in QUERY_STRING um sicherzustellen, dass Pfade nicht vermischt oder vorzeitig entschlüsselt werden.
  • 使用する REQUEST_URI um die ursprüngliche URI der Anfrage zu erhalten, ohne dass eine Normalisierung oder Dekodierung stattfindet.
  • Achten Sie genauer auf alle Fälle der Verwendung von $uri o $document_uri und möglicherweise $fastcgi_path_info die normalerweise die entschlüsselten und normalisierten Pfade enthält.
  • Verwenden Sie die Tricks zum Umschreiben, wie sie in der verknüpfte Antwort undecodiert zu platzieren $request_uri zurück in $uri . Beachten Sie, dass Sie die Abfragezeichenfolge möglicherweise auch manuell entfernen müssen, wenn Sie diesen Weg wählen.

BTW, beachten Sie, dass das, was Sie in erster Linie tun, ist eine Art Spiel mit dem Feuer, denn es ist sehr einfach, Sicherheitslücken einzuführen, wenn Sie nicht vollständig verstehen, was Sie tun, und wenn jemand eines Tages beschließen, einen Vorteil von Ihnen verlassen sich auf diese kodierten Pfade Umgehung ordnungsgemäße Handhabung und Prüfung von nginx zu nehmen.

Die Tatsache, dass das, was Sie tun wollen, im Apache so funktioniert, wie es ist, ist eher ein Fehler als eine Funktion - dies funktioniert in nginx anders, und zwar durch Design und um eine ganze Klasse von Sicherheitslücken zu verhindern.

0voto

János Márkus Punkte 91

Ich hatte das gleiche Problem mit meinem nginx + uWSGI + flask Stack. Ich löste es, indem ich eine Rewrite-Regel in die Nginx-Konfiguration einführte:

location @app {
    rewrite ./ $request_uri break;
    include uwsgi_params;
    uwsgi_pass unix:/tmp/uwsgi.sock;
}

Update: Dies scheint Abfrageparameter zu brechen, so musste ich dies tun:

location @app {
    set $plain_uri $request_uri ;
    if ( $plain_uri ~ (.*)\?.* ) {
        set $plain_uri $1 ;
    }
    rewrite .* $plain_uri break;
    include uwsgi_params;
    uwsgi_pass unix:/tmp/uwsgi.sock;
}

Das Problem dabei ist, dass die ursprünglich verschlüsselte URL erneut verschlüsselt wird, so dass ich die Verschlüsselung insgesamt viermal aufheben muss.

-1voto

mUnk Punkte 127

Sie werden keine Probleme haben, wenn Sie URL-Abfrageparameter verwenden. Wenn Sie Ihre Server-Routen kontrollieren können, könnten Sie sich dafür entscheiden:

http://example.com/articles/view/?path=foo%2fbar

und nginx wird %2f nicht berühren

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X