Tragbarer und sicherer Weg PATH_INFO zu erhalten

8

Ich suche einen portablen Weg, um die (handliche) $_SERVER['PATH_INFO'] Variable zu erhalten.

Nach einiger Zeit stellt sich heraus, dass PATH_INFO von CGI / 1.1 stammt und nicht immer in jeder Konfiguration vorhanden ist.

Was ist der beste (meist sicherheitsbezogene) Weg, um diese Variable zu erhalten - abgesehen von der manuellen Extraktion (Sicherheitsbedenken).

    
LiraNuna 10.12.2009, 21:08
quelle

6 Antworten

11

Nun, ich bin mir (fast) sicher, dass, ohne die% superglobalen Schlüssel $_SERVER zu verwenden, eine alternative Möglichkeit zur Bestimmung von PATH_INFO einfach unmöglich ist, das heißt lets führen zuerst alle $ _SERVER-Schlüssel auf, die wir möglicherweise möglicherweise verwenden:

  • 'PHP_SELF'
  • 'QUERY_STRING'
  • 'SCRIPT_FILENAME'
  • 'PATH_TRANSLATED'
  • 'SCRIPT_NAME'
  • 'REQUEST_URI'
  • 'PATH_INFO'
  • 'ORIG_PATH_INFO'

Wir müssen natürlich die letzten beiden ignorieren. Jetzt sollten wir ( Ich weiß das nicht genau, ich nehme nur an, weil du das gesagt hast ) alle Schlüssel filtern, die in dem von dir angegebenen Link existieren ( welches BTW ist offline ATM ), das lässt uns mit der folgende Schlüssel:

  • 'PHP_SELF'
  • 'SCRIPT_FILENAME'
  • 'REQUEST_URI'

Was Ihren Kommentar zu Anthonys antwort :

  

Sie jonglieren jetzt nur noch Variablen.    SCRIPT_FILENAME ist ein Teil des CGI   Spez. Es wird nicht verfügbar sein, wenn    PATH_INFO ist nicht verfügbar. Wie für    REQUEST_URI , es ist apaches mod_rewrite   Spezifisch. - LiraNuna

Ich betreibe LightTPD / 1.4.20-1 (Win32) mit PHP 5.3.0 als CGI, cgi.fix_pathinfo = 1 und $_SERVER['REQUEST_URI'] steht mir sehr zur Verfügung , ich kann mich auch daran erinnern dieselbe Variable in den Tagen, als niemand mod_rewrite verwendet hat, also meine ehrliche bescheidene Vermutung ist, dass du in diesem Punkt ganz falsch liegst . In Bezug auf den Schlüssel SCRIPT_FILENAME kann ich diesen einen ATM nicht testen. Trotzdem, wenn wir unsere Augen wirklich hart schließen und glauben, dass du Recht hast, bleibt uns nur eine Variable:

  • 'PHP_SELF'

Ich versuche hier nicht hart zu sein (und ich glaube immer noch, dass es mehr Lösungen gibt), aber wenn PHP_SELF der einzige Schlüssel ist, mit dem wir arbeiten sollen ( vorausgesetzt, es gibt keine Impositionen auf PHP_SELF selbst ) gibt es nur noch eine Lösung:

%Vor%

Diese Funktion sollte funktionieren, es kann jedoch Probleme mit der Konstante __FILE__ geben, da sie den Pfad zur Datei zurückgibt, in der die __FILE__ -Konstante deklariert ist, und nicht den Pfad zum angeforderten PHP-Skript , deshalb gibt es das $ whatToUse: Sie können durch 'SCRIPT_FILENAME' ersetzen oder wenn Sie wirklich an das glauben, was Sie sagen, verwenden Sie einfach '.php' .

Sie sollten auch lesen, warum Sie PHP_SELF nicht verwenden sollten .

Wenn das nicht für Sie funktioniert, tut es mir leid, aber mir fällt noch etwas ein.

BEARBEITEN - Noch etwas mehr für Sie:

Alix Axel 16.12.2009, 17:09
quelle
2

Ich denke, hier ist ein Trick, um "path_info" auf andere Weise zu erhalten:

%Vor%

Zum Beispiel Zugriff auf eine URL wie: Ссылка , der Wert von $path_info wäre : "/some/path/here"

Es funktionierte für mich in verschiedenen Apache-Servern unter Windows und Linux, aber ich bin mir nicht 100% sicher, ob es "sicher" und "portabel" ist, ich teste es nicht in "ALLEN" Serverkonfigurationen, aber scheint zu funktionieren ...

    
Sahib J. Leo 11.04.2011 17:25
quelle
1
%Vor%

Bearbeiten: Ohne SCRIPT_NAME und vorausgesetzt, Sie haben DOCUMENT_ROOT (oder können Sie selbst definieren / entdecken) und vorausgesetzt, Sie haben SCRIPT_FILENAME, dann:

%Vor%

Auch @ Anthony (nicht genug rep zu kommentieren, sorry): Mit str_replace () wird überall in der Zeichenfolge übereinstimmen. Es funktioniert nicht garantiert, du möchtest es nur am Anfang anpassen. Außerdem funktioniert Ihre Methode, nur einen Schrägstrich zurück (über strrpos) SCRIPT_NAME zu bestimmen, nur, wenn das Skript unter der Wurzel ist, weshalb Sie besser diffind script_filename gegen docroot.

    
oops 15.12.2009 05:02
quelle
1

Es hängt von den Definitionen für "tragbar" und "sicher" ab.

Lass mich sehen, ob ich verstanden habe:

1) Sie sind nicht an CLI interessiert:

  • Sie haben PHP / CGI
  • erwähnt
  • PATH_INFO ist ein Stück einer URL; Daher ist es nur sinnvoll, PATH_INFO zu diskutieren, wenn auf das Skript von einer URL zugegriffen wird (d. h. von einer HTTP-Verbindung, die normalerweise von einem Browser angefordert wird)

2) Sie möchten PATH_INFO in allen OS + HTTP Server + PHP Kombination haben:

  • OS kann Windows, Linux, usw. sein
  • Der HTTP-Server kann Apache 1, Apache 2, NginX, Lighttpd usw. sein.
  • PHP kann Version 4, 5, 6 oder irgendeine Version
  • sein

Hmmm ... PHP_INFO, im $ _SERVER-Array, wird von PHP nur unter bestimmten Bedingungen an ein laufendes Skript übergeben, abhängig von der oben erwähnten Software. Es ist nicht immer verfügbar. Dasselbe gilt für das gesamte $ _SERVER-Array!

Kurz gesagt: " $ _ SERVER hängt vom Server ab " ... also kann eine portable Lösung nicht auf $ _SERVER übertragen werden ... (um nur ein Beispiel zu nennen: Wir haben ein Tutorial für Richten Sie PHP / CGI $ _SERVER-Variablen auf dem NginX-HTTP-Server unter kbeezie.com/view/php-self-path-nginx/) ein

3) Trotz allem, was oben erwähnt wurde, ist es erwähnenswert, dass es möglich ist, PATH_INFO durch Anwendung regulärer Ausdrücke zu erhalten, wenn wir die angeforderte vollständige URL als String zur Verfügung haben und andere PHP-String-Funktionen, sicher (auch Validierung der Eingabe-String als eine gültige URI).

Also, vorausgesetzt, wir haben die URL-Zeichenfolge ... dann JA, WIR HABEN eine portable und sichere Möglichkeit, PATH_INFO daraus zu bestimmen.

Nun haben wir zwei klare und fokussierte Implementierungsprobleme:

  1. Wie erhält man die URL?
  2. Wie erhalte ich PATH_INFO von der URL?

Unter verschiedenen Möglichkeiten ist hier ein möglicher Ansatz:

Wie erhalte ich die URL?

1) Mit Ihrem umfassenden und umfassenden Wissen über jede HTTP Server + OS + PHP Versionskombination, überprüfen und versuchen Sie jede Möglichkeit, die URL aus dem $ _SERVER Array zu erhalten (verifizieren Sie 'PHP_SELF', 'QUERY_STRING', 'SCRIPT_FILENAME', "PATH_TRANSLATED", "SCRIPT_NAME", "REQUEST_URI", "PATH_INFO", "ORIG_PATH_INFO", "HTTP_HOST", "DOCUMENT_ROOT" oder was auch immer)

2) Wenn der vorherige Schritt fehlgeschlagen ist, lassen Sie das PHP-Skript einen JavaScript-Code zurückgeben, der "document.URL" zurücksendet. (Das Portabilitätsproblem wurde auf die Clientseite übertragen.)

Wie erhalte ich PATH_INFO von der URL?

Dieser hier verlinkte Code tut das.

Das ist meine bescheidene Meinung und Annäherung an das Problem.

Was denkst du?

    
J. Bruni 29.05.2010 12:45
quelle
0

Ich habe die Kommentare oder den Link vor dem Posten nicht gesehen. Hier ist etwas, das funktionieren könnte, basierend auf dem, was die oben genannte Seite als CGI-abgeleitete Variablen angibt:

%Vor%     
Anthony 15.12.2009 05:32
quelle
-1

könntest du versuchen

%Vor%     
streetparade 10.12.2009 21:17
quelle

Tags und Links