Ich habe hier eine Reihe von Beiträgen gesehen, in denen gesagt wurde, die $_REQUEST
Variable nicht zu verwenden . Normalerweise nicht, aber manchmal ist es praktisch. Was stimmt damit nicht?
php
methods
form-submit
Sprugman
quelle
quelle
$_REQUEST
. Siehe php.net/request_order Ich bin gerade auf diese Abwärtskompatibilitätspause gestoßen, als ich erwartete, dass Cookie-Daten vorhanden sind,$_REQUEST
und mich fragte, warum es nicht funktionierte! Der größte Grund, die Verwendung von $ _REQUEST zu vermeiden, besteht nun darin, dass Ihr Skript sich nichtrequest_order
selbst festlegen kann (es istPHP_INI_PERDIR
), sodass eine Änderung von php.ini leicht die Annahmen brechen kann, auf denen Ihr Skript basiert. Es ist besser, diese Annahmen direkt in Ihr Skript aufzunehmen.Antworten:
Es ist absolut nichts Falsches daran, Eingaben von beiden
$_GET
und$_POST
auf kombinierte Weise zu erhalten. Genau das möchten Sie fast immer tun:Bei einer einfachen idempotenten Anfrage, die normalerweise über GET gesendet wird, besteht die Möglichkeit, dass die gewünschte Datenmenge nicht in eine URL passt, sodass sie aus praktischen Gründen stattdessen zu einer POST-Anfrage mutiert wurde.
Für eine Anfrage, die einen echten Effekt hat, müssen Sie überprüfen, ob sie von der POST-Methode gesendet wurde. Der Weg, dies zu tun, besteht darin,
$_SERVER['REQUEST_METHOD']
explizit zu überprüfen und sich nicht darauf zu verlassen$_POST
, dass ein GET leer ist. Wenn dies derPOST
Fall ist , möchten Sie möglicherweise dennoch einige Abfrageparameter aus der URL entfernen.Nein, das Problem mit
$_REQUEST
hat nichts mit dem Zusammenführen von GET- und POST-Parametern zu tun. Es ist so, dass es standardmäßig auch enthält$_COOKIE
. Und Cookies sind wirklich überhaupt keine Parameter für die Formularübermittlung: Sie möchten sie fast nie als dasselbe behandeln.Wenn auf Ihrer Site versehentlich ein Cookie mit demselben Namen wie einer Ihrer Formularparameter gesetzt wird, funktionieren die Formulare, die auf diesem Parameter basieren, auf mysteriöse Weise nicht mehr ordnungsgemäß, da die Cookie-Werte die erwarteten Parameter überschreiben. Dies ist sehr einfach, wenn Sie mehrere Apps auf derselben Site haben, und kann sehr schwer zu debuggen sein, wenn Sie nur ein paar Benutzer mit alten Cookies haben, die Sie nicht mehr verwenden, um herumzuhängen und die Formulare auf eine Weise zu brechen, nein -eine andere kann reproduzieren.
Sie können dieses Verhalten mit der request_order- Konfiguration in PHP 5.3 in eine viel sinnvollere
GP
(keineC
) Reihenfolge ändern . Wo dies nicht möglich ist, würde ich persönlich vermeiden$_REQUEST
und, wenn ich ein kombiniertes GET + POST-Array benötige, es manuell erstellen.quelle
a="foo"
und $ _COOKIE ista="bar"
, gibt es dann hier Override / Konflikte?Ich habe einige Newsgroup-Beiträge zu PHP Internals durchgesehen und eine interessante Diskussion zu diesem Thema gefunden. Der erste Thread handelte von etwas anderem, aber einer Bemerkung von Stefan Esser, einem (wenn nicht dem ) Sicherheitsexperten in der PHP-Welt, lenkte die Diskussion auf die Sicherheitsauswirkungen der Verwendung von $ _REQUEST für einige Posts.
Unter Berufung auf Stefan Esser über PHP Internals
und in einer späteren Antwort auf den gleichen Thread
Die Diskussion wird für einige weitere Beiträge fortgesetzt und ist interessant zu lesen.
Wie Sie sehen können, besteht das Hauptproblem bei $ _REQUEST nicht darin, dass es Daten von $ _GET und $ _POST enthält, sondern auch von $ _COOKIE. Einige andere Leute auf der Liste schlugen vor, die Reihenfolge zu ändern, in der $ _REQUEST gefüllt wird, z. B. zuerst $ _COOKIE, aber dies könnte zu zahlreichen anderen potenziellen Problemen führen, beispielsweise bei der Sitzungsbehandlung .
Sie können jedoch $ _COOKIES in der globalen $ _REQUEST-Liste vollständig weglassen, damit es von keinem der anderen Arrays überschrieben wird (Sie können es sogar auf eine beliebige Kombination seiner Standardinhalte beschränken, wie das PHP-Handbuch in der Einstellung variable_order ini sagt uns:
Andererseits könnten Sie auch in Betracht ziehen, $ _REQUEST nicht vollständig zu verwenden, einfach weil Sie in PHP auf Umgebung, Get, Post, Cookie und Server in ihren eigenen Globals zugreifen können und einen Angriffsvektor weniger haben. Sie müssen diese Daten noch bereinigen, aber Sie müssen sich weniger Sorgen machen.
Nun fragen Sie sich vielleicht, warum $ _REQUEST überhaupt existiert und warum es nicht entfernt wird. Dies wurde auch bei PHP Internals gefragt. Unter Berufung auf Rasmus Lerdorf über Warum gibt es $ _REQUEST? auf PHP Internals
Wie auch immer, hoffe, das bringt etwas Licht.
quelle
$_REQUEST
bezieht sich auf alle Arten von Anfragen (GET, POST usw.). Dies ist manchmal nützlich, aber normalerweise ist es besser, die genaue Methode anzugeben ($ _GET, $ _POST usw.).quelle
$_REQUEST
wird im Allgemeinen aus dem gleichen Grund als schädlich angesehen, aus dem Datentransformationen mit einfacher bis mittlerer Komplexität häufig im Anwendungscode ausgeführt werden, anstatt in SQL deklariert zu werden: Einige Programmierer saugen.Wenn man also dazu neigt,
$_REQUEST
überall zu verwenden , kann ich über GET alles tun, was ich über POST tun könnte. Dies bedeutet, dass<img>
auf meiner (böswilligen) Website Tags eingerichtet werden, die dazu führen, dass Benutzer, die in Ihrem E-Commerce-Modul angemeldet sind, stillschweigend Produkte kaufen, oder ich kann dazu führen, dass sie auf Links klicken, die zu gefährlichen Handlungen oder zur Offenlegung sensibler Informationen führen (wahrscheinlich für mich).Dies liegt jedoch daran, dass ein unerfahrener oder zumindest unerfahrener PHP-Programmierer einfache Fehler macht. Stellen Sie zunächst fest, wann Daten von welchem Typ geeignet sind. Zum Beispiel habe ich einen Webdienst, der Antworten in URLEncoding, XML oder JSON zurückgeben kann. Die Anwendung entscheidet, wie die Antwort formatiert werden soll, indem der HTTP_ACCEPT-Header überprüft wird. Sie kann jedoch durch Senden des
format
Parameters zu einem bestimmten Header gezwungen werden.Bei der Überprüfung des Inhalts des Formatparameters kann dieser abhängig von einer Vielzahl von Faktoren über Querystring oder Postdata gesendet werden, nicht zuletzt, ob die aufrufenden Anwendungen "& format = json" mit ihrer Anforderung mischen möchten oder nicht. In diesem Fall
$_REQUEST
ist dies sehr praktisch, da ich so etwas nicht eingeben muss:Ich werde nicht viel weiter streifen, aber es genügt zu sagen, dass die
$_REQUEST
Verwendung nicht davon abgeraten wird, weil sie von Natur aus gefährlich ist - es ist nur ein weiteres Werkzeug, das genau das tut, was von ihm verlangt wird, ob Sie diese Implikationen verstehen oder nicht - es ist das schlechte, faule oder nicht informierte Entscheidung eines armen, faulen oder unerfahrenen Programmierers, die dieses Problem verursacht.Wie man
$_REQUEST
sicher benutztaddslashes()
oder*_escape_string()
. Wirst du es dem Benutzer wieder zeigen?htmlentities()
oderhtmlspecialchars()
. Erwarten Sie numerische Daten?is_numeric()
oderctype_digit()
. Tatsächlich dienenfilter_input()
die zugehörigen Funktionen lediglich dazu, Daten zu überprüfen und zu bereinigen. Verwenden Sie diese Werkzeuge immer.$post_clean
. Alternativ können Sie auch direkt in den Superglobalen bereinigen. Ich befürworte jedoch die Verwendung einer separaten Variablen, da dies das Erkennen von Schwachstellen im Code erleichtert, da alles, was direkt auf eine Superglobale und nicht auf deren bereinigtes Äquivalent verweist, als gefährlicher Fehler angesehen wird .Denken Sie abschließend an diese einfache Regel:
SICHERHEIT IST, WAS SIE MACHEN, MENSCHEN!
BEARBEITEN:
Ich stark bobince Rat empfehlen: wenn Sie können, den eingestellten
request_order
Parameter in php.ini auf „GP“; Das heißt, keine Cookie-Komponente. In über 98% der Fälle gibt es dafür fast keine vernünftigen Gründe, da Cookie-Daten fast nie als mit dem Querystring oder den Postdaten vergleichbar angesehen werden sollten.PS, Anekdote!
Ich kannte einen Programmierer, der an
$_REQUEST
einen Ort dachte, an dem einfach Daten gespeichert werden konnten, auf die superglobal zugegriffen werden konnte. Wichtige Benutzernamen und Passwörter, Pfade zu Dateien, Sie benennen es und es wurde in gespeichert$_REQUEST
. Er war ein bisschen überrascht (wenn auch leider nicht komisch), als ich ihm erzählte, wie sich diese Variable verhält. Unnötig zu erwähnen, dass diese Praxis abgesetzt wurde.quelle
GET-Anforderungen sollten idempotent sein und POST-Anforderungen im Allgemeinen nicht. Dies bedeutet, dass Daten in
$_GET
und$_POST
im Allgemeinen auf unterschiedliche Weise verwendet werden sollten.Wenn Ihre Anwendung Daten von verwendet
$_REQUEST
, verhält sie sich für GET- und POST-Anforderungen gleich, was die Idempotenz von GET verletzt.quelle
Es ist vage. Sie wissen nicht wirklich , wie die Daten zu Ihnen gelangt sind, da sie Post-, Get- und Cookie-Daten enthalten. Ich denke nicht unbedingt, dass dies immer eine schlechte Sache ist, es sei denn, Sie müssen die Versandart kennen oder einschränken.
quelle
Ich benutze es eigentlich gerne. Es gibt Ihnen die Flexibilität, GET oder POST zu verwenden, was sich für Suchformulare als nützlich erweisen kann, bei denen die meisten Zeitdaten POST-fähig sind. Manchmal möchten Sie jedoch einen Link zu einer bestimmten Suche angeben, sodass Sie stattdessen GET-Parameter verwenden können .
Wenn Sie sich viele andere Sprachen ansehen (z. B. ASP.NET), unterscheiden sie überhaupt nicht zwischen GET- und POST-Variablen.
ETA :
Ich habe REQUEST noch nie verwendet, um COOKIE-Werte zu erhalten, aber ich denke, Kyle Butt macht in den Kommentaren zu diesem Beitrag einen großen Punkt darüber. Es ist keine gute Idee, REQUEST zu verwenden, um COOKIE-Werte zu erhalten. Ich glaube, er hat Recht, dass es ein echtes Potenzial für die Fälschung von standortübergreifenden Anfragen gibt, wenn Sie dies tun.
Außerdem wird die Reihenfolge, in der Inhalte in REQUEST geladen werden, durch Konfigurationsparameter in der php.ini (variables_order und request_order) gesteuert. Wenn Sie also dieselbe Variable über POST und GET übergeben haben, hängt es tatsächlich von diesen INI-Einstellungen ab, welche tatsächlich in REQUEST eingeht. Dies kann die Portabilität beeinträchtigen, wenn Sie von einer bestimmten Reihenfolge abhängig sind und diese Einstellungen anders konfiguriert sind, als Sie es erwarten.
quelle
Es ist wichtig zu verstehen, wann POST verwendet wird, wann GET verwendet wird und wann ein Cookie verwendet wird. Mit $ _REQUEST könnte der Wert, den Sie betrachten, von einem von ihnen stammen. Wenn Sie erwarten, den Wert von einem POST oder einem GET oder von einem COOKIE zu erhalten, ist es für jemanden, der Ihren Code liest, informativer, die spezifische Variable anstelle von $ _REQUEST zu verwenden.
Jemand anderes wies auch darauf hin, dass Sie nicht möchten, dass alle POSTs oder Cookies von GETs überschrieben werden, da für alle unterschiedliche standortübergreifende Regeln gelten. Wenn Sie beispielsweise Ajax-Daten zurückgeben, während Sie $ _REQUEST verwenden, sind Sie anfällig zu einem Cross-Site-Skript-Angriff.
quelle
Die einzige Verwendung
$_REQUEST
ist keine schlechte Idee, wenn Sie GET verwenden.Und selbst mit GET
$_GET
ist die Eingabe kürzer als$_REQUEST
;)quelle
$_POST
wenn es wichtig ist, dass die Daten POSTDATA sind. Man sollte verwenden,$_REQUEST
wenn die Daten unabhängig vom verwendeten HTTP-Verb sind. In all diesen Fällen sollten alle Eingabedaten sorgfältig bereinigt werden.Ich werde möglicherweise nur verwendet, wenn Sie die aktuelle URL oder den aktuellen Hostnamen abrufen möchten, aber zum tatsächlichen Parsen von Daten von dieser URL, z. B. Parmetern mit dem Symbol &, ist dies wahrscheinlich keine gute Idee. Im Allgemeinen möchten Sie keine vage Beschreibung dessen verwenden, was Sie versuchen zu tun. Wenn Sie spezifisch sein müssen, ist $ _REQUEST schlecht. Wenn Sie nicht spezifisch sein müssen, können Sie es gerne verwenden. Ich würde denken.
quelle
$_REQUEST
mit$_SERVER['QUERY_STRING']
?Wenn Sie wissen, welche Daten Sie möchten, sollten Sie explizit danach fragen. IMO, GET und POST sind zwei verschiedene Tiere, und ich kann mir keinen guten Grund vorstellen, warum Sie jemals Post-Daten und Abfragezeichenfolgen mischen müssten. Wenn jemand einen hat, wäre ich interessiert.
Es kann praktisch sein, $ _REQUEST zu verwenden, wenn Ihre Skripte auf dieselbe Weise auf GET oder POST reagieren. Ich würde jedoch argumentieren, dass dies ein äußerst seltener Fall sein sollte, und in den meisten Fällen werden zwei separate Funktionen bevorzugt, um zwei separate Konzepte zu handhaben oder zumindest die Methode zu überprüfen und die richtigen Variablen auszuwählen. Der Programmablauf ist normalerweise viel einfacher zu verfolgen, wenn kein Querverweis erforderlich ist, woher die Variablen stammen könnten. Seien Sie freundlich zu der Person, die Ihren Code in 6 Monaten pflegen muss. Es könntest du sein.
Überlegen Sie zusätzlich zu den Sicherheitsproblemen und WTFs, die durch Cookies und Umgebungsvariablen in der REQUEST-Variablen verursacht werden (lassen Sie mich nicht mit GLOBAL beginnen), was in Zukunft passieren könnte, wenn PHP andere Methoden wie PUT und DELETE nativ unterstützt. Obwohl es äußerst unwahrscheinlich ist, dass diese in die Superglobale REQUEST integriert werden, ist es möglich, dass sie als Option in die Einstellung variable_order aufgenommen werden. Sie haben also wirklich keine Ahnung, was REQUEST enthält und was Vorrang hat, insbesondere wenn Ihr Code auf einem Server eines Drittanbieters bereitgestellt wird.
Ist POST sicherer als GET? Nicht wirklich. Es ist besser, GET zu verwenden, wenn dies praktisch ist, da Sie in Ihren Protokollen leichter sehen können, wie Ihre Anwendung ausgenutzt wird, wenn sie angegriffen wird. POST ist besser für Vorgänge geeignet, die sich auf den Domänenstatus auswirken, da Spider ihnen im Allgemeinen nicht folgen und vorausschauende Abrufmechanismen nicht alle Ihre Inhalte löschen, wenn Sie sich bei Ihrem CMS anmelden. Bei der Frage ging es jedoch nicht um die Vorzüge von GET gegenüber POST, sondern darum, wie der Empfänger die eingehenden Daten behandeln sollte und warum es schlecht ist, sie zusammenzuführen. Dies ist also wirklich nur eine BTW.
quelle
Ich denke, es gibt kein Problem damit
$_REQUEST
, aber wir müssen vorsichtig sein, wenn wir es verwenden, da es eine Sammlung von Variablen aus 3 Quellen (GPC) ist.Ich denke, es
$_REQUEST
ist immer noch verfügbar, um alte Programme mit neuen PHP-Versionen kompatibel zu machen, aber wenn wir neue Projekte (einschließlich neuer Bibliotheken) starten, sollten wir sie meiner Meinung nach nicht$_REQUEST
mehr verwenden, um die Programme klarer zu machen. Wir sollten sogar in Betracht ziehen, Verwendungen zu löschen$_REQUEST
und durch eine Wrapper-Funktion zu ersetzen, um das Programm leichter zu machen, insbesondere bei der Verarbeitung großer übermittelter Textdaten, da es$_REQUEST
Kopien von enthält$_POST
.quelle
Wow ... einige meiner Skripte funktionierten aufgrund eines Upgrades auf PHP 5.3 nicht mehr . Haben Sie dasselbe getan: Nehmen Sie an, dass bei Verwendung der
$_REQUEST
Variablen Cookies gesetzt werden . Mit dem Upgrade funktionierte genau das nicht mehr.Ich rufe Cookie-Werte jetzt separat mit
$_COOKIE["Cookie_name"]
...quelle
Das zentrale Problem ist, dass es Cookies enthält, wie andere gesagt haben.
In PHP 7 können Sie dies tun:
Dies vermeidet das Cookie-Problem und gibt Ihnen im schlimmsten Fall ein leeres Array und bestenfalls eine Fusion von $ _GET und $ _POST, wobei letzteres Vorrang hat. Wenn Sie nicht zu sehr damit beschäftigt sind, die URL-Injektion von Parametern über die Abfragezeichenfolge zuzulassen, ist dies sehr praktisch.
quelle
Es ist sehr unsicher. Es ist auch umständlich, da Sie nicht wissen, ob Sie einen POST oder einen GET oder eine andere Anfrage erhalten. Sie sollten den Unterschied zwischen ihnen beim Entwerfen Ihrer Anwendungen wirklich kennen. GET ist sehr unsicher, da es in der URL übergeben wird und für fast nichts anderes als die Seitennavigation geeignet ist. POST ist zwar selbst nicht sicher, bietet jedoch eine Sicherheitsstufe.
quelle