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
$ _REQUEST ist eine der größten Designschwächen in PHP. Jede Anwendung, die $ _REQUEST verwendet, ist höchstwahrscheinlich anfällig für Probleme mit verzögerten Cross Site Request Forgery. (Dies bedeutet im Grunde, dass wenn beispielsweise ein Cookie mit dem Namen (Alter) vorhanden ist, der GET / POST-Inhalt immer überschrieben wird und daher unerwünschte Anforderungen ausgeführt werden.)
und in einer späteren Antwort auf den gleichen Thread
Es geht nicht darum, dass jemand GET, POST fälschen kann; COOKIE-Variablen. Es geht um die Tatsache, dass COOKIEs GET- und POST-Daten in REQUEST überschreiben.
Daher könnte ich Ihren Browser mit einem Cookie infizieren, das zB action = logout lautet, und von diesem Tag an können Sie die Anwendung nicht mehr verwenden, da REQUEST [action] für immer abgemeldet ist (bis Sie das Cookie manuell löschen).
Und Sie mit einem COOKIE zu infizieren ist so einfach ...
a) Ich könnte eine XSS-Vuln in jeder Anwendung auf einer Subdomain verwenden.
B ) Ich habe jemals versucht, ein Cookie für * .co.uk oder * .co.kr zu setzen, wenn Sie ein besitzen Single Domain da?
c) Andere domänenübergreifende Möglichkeiten ...
Und wenn Sie glauben, dass dies kein Problem ist, kann ich Ihnen sagen, dass es eine einfache Möglichkeit gibt, z. B. ein * .co.kr-Cookie zu setzen, das dazu führt, dass mehrere PHP-Versionen nur weiße Seiten zurückgeben. Stellen Sie sich vor: Nur ein einziges Cookie, um alle PHP-Seiten in * .co.kr zu beenden
Und indem Sie eine illegale Sitzungs-ID in einem für * .co.kr gültigen Cookie in einer Variablen namens + PHPSESSID = illegal festlegen , können Sie weiterhin jede PHP-Anwendung in Korea mit PHP-Sitzungen DOSEN ...
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:
variable_order Legt die Reihenfolge der Analyse der EGPCS-Variablen (Environment, Get, Post, Cookie und Server) fest. Wenn beispielsweise variables_order auf "SP" gesetzt ist, erstellt PHP die Superglobalen $ _SERVER und $ _POST, jedoch nicht $ _ENV, $ _GET und $ _COOKIE. Die Einstellung auf "" bedeutet, dass keine Superglobalen gesetzt werden.
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
Je mehr solche Dinge wir entfernen, desto schwieriger wird es für die Leute, schnell auf neuere, schnellere und sicherere Versionen von PHP umzusteigen. Das ist für alle weitaus frustrierender als ein paar "hässliche" Legacy-Funktionen. Wenn es einen anständigen technischen Grund, Leistung oder Sicherheit gibt, müssen wir uns das genau ansehen. In diesem Fall sollten wir uns nicht ansehen, ob wir $ _REQUEST entfernen sollen, sondern ob wir Cookie-Daten daraus entfernen sollen. Viele Konfigurationen tun dies bereits, einschließlich meiner eigenen, und es gibt einen starken gültigen Sicherheitsgrund dafür, dass Cookies nicht in $ _REQUEST enthalten sind. Die meisten Leute verwenden $ _REQUEST, um GET oder POST zu bezeichnen, ohne zu wissen, dass es auch Cookies enthalten könnte, und als solche könnten Bösewichte möglicherweise einige Tricks zur Cookie-Injektion ausführen und naive Anwendungen brechen.
Wie auch immer, hoffe, das bringt etwas Licht.