Ich habe hier eine Reihe von Beiträgen gesehen, in denen empfohlen wird, die $_REQUEST
variabel. Normalerweise tue ich das nicht, aber manchmal ist es praktisch. Was ist daran falsch?
Antworten
Zu viele Anzeigen?Wenn Sie wissen, welche Daten Sie benötigen, sollten Sie diese ausdrücklich anfordern. IMO sind GET und POST zwei verschiedene Dinge, und ich kann mir keinen guten Grund vorstellen, warum man Post-Daten und Abfrage-Strings vermischen sollte. Wenn jemand einen hat, wäre ich daran interessiert.
Es kann praktisch sein, $_REQUEST zu verwenden, wenn Ihre Skripte entweder auf GET oder POST in gleicher Weise reagieren können. Ich würde jedoch behaupten, dass dies ein extrem seltener Fall sein sollte, und in den meisten Fällen sind zwei separate Funktionen zur Behandlung zweier unterschiedlicher Konzepte oder zumindest die Überprüfung der Methode und die Auswahl der richtigen Variablen vorzuziehen. Der Programmablauf ist in der Regel sehr viel einfacher zu verfolgen, wenn man nicht nachsehen muss, woher die Variablen kommen könnten. Seien Sie nett zu der Person, die Ihren Code in 6 Monaten pflegen muss. Das könnten Sie sein.
Zusätzlich zu den Sicherheitsproblemen und WTFs, die durch Cookies und Umgebungsvariablen in der REQUEST-Variable verursacht werden (lassen Sie mich nicht mit GLOBAL anfangen), sollten Sie bedenken, was in der Zukunft passieren könnte, wenn PHP anfängt, andere Methoden wie PUT und DELETE nativ zu unterstützen. Es ist zwar extrem unwahrscheinlich, dass diese in die superglobale Variable REQUEST integriert werden, aber es ist möglich, dass sie als Option in die variable_order-Einstellung aufgenommen werden könnten. 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 es praktisch ist, weil es einfacher ist, in Ihren Protokollen zu sehen, wie Ihre Anwendung ausgenutzt wird, wenn sie angegriffen wird. POST ist besser für Operationen, die den Domänenstatus betreffen, weil Spider ihnen im Allgemeinen nicht folgen, und prädiktive Abrufmechanismen werden nicht alle Inhalte löschen, wenn Sie sich in Ihr CMS einloggen. In 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.
Ich denke, es gibt kein Problem mit $_REQUEST
aber wir müssen bei der Verwendung vorsichtig sein, da es sich um eine Sammlung von Variablen aus 3 Quellen handelt (GPC).
Ich denke $_REQUEST
ist immer noch verfügbar, um alte Programme mit neuen php-Versionen kompatibel zu machen, aber wenn wir neue Projekte starten (einschließlich neuer Bibliotheken), sollten wir nicht $_REQUEST
mehr, um die Programme übersichtlicher zu gestalten. Wir sollten sogar erwägen, die Verwendung von $_REQUEST
und sie durch eine Wrapper-Funktion zu ersetzen, um das Programm leichter zu machen, insbesondere bei der Verarbeitung großer Textdaten, da $_REQUEST
enthält Kopien von $_POST
.
// delete $_REQUEST when program execute, the program would be lighter
// when large text submitted
unset($_REQUEST);
// wrapper function to get request var
function GetRequest($key, $default = null, $source = '')
{
if ($source == 'get') {
if (isset($_GET[$key])) {
return $_GET[$key];
} else {
return $default;
}
} else if ($source == 'post') {
if (isset($_POST[$key])) {
return $_POST[$key];
} else {
return $default;
}
} else if ($source == 'cookie') {
if (isset($_COOKIE[$key])) {
return $_COOKIE[$key];
} else {
return $default;
}
} else {
// no source specified, then find in GPC
if (isset($_GET[$key])) {
return $_GET[$key];
} else if (isset($_POST[$key])) {
return $_POST[$key];
} else if (isset($_COOKIE[$key])) {
return $_COOKIE[$key];
} else {
return $default;
}
}
}
Darren Cook: "Seit php 5.3 sagt die Standard php.ini, dass nur GET und POST Daten in
$_REQUEST
. Siehe php.net/request_order Ich habe gerade über diese Abwärtskompatibilitätslücke gestolpert, als ich die Cookie-Daten Daten in$_REQUEST
und fragte mich, warum es nicht funktionierte!"
Wow... gerade haben einige meiner Skripte aufgehört zu funktionieren, weil ein Upgrade auf PHP 5.3 . Hat das Gleiche gemacht: angenommen, dass Cookies gesetzt werden, wenn man die $_REQUEST
variabel. Mit dem Upgrade funktioniert genau das nicht mehr.
Ich rufe die Cookie-Werte jetzt separat mit $_COOKIE["Cookie_name"]
...
Stellen Sie einfach sicher, dass Sie die korrekte Parameter in Ihrem php.ini (unten ist Standard, solange nicht auf GP gesetzt C , hier werden keine Cookies verwendet)
request_order = "GP"
was bedeutet POST überschreibt GET und es wird Ihnen gut gehen.
Der Grund für $_REQUEST
ist einfach Konsolidierung von $_GET und $_POST. Wenn Sie ein Formular senden und durch viele Links auf Ihrer Seite navigieren, ist es sehr nützlich, wenn Sie ein Ort die die Staat : $_REQUEST
Das Hauptproblem besteht darin, dass es Cookies enthält, wie andere bereits gesagt haben.
In PHP 7 können Sie dies tun:
$request = array_merge($_GET ?? [], $_POST ?? []);
Dadurch wird das Cookie-Problem vermieden und Sie erhalten im schlimmsten Fall ein leeres Array und im besten Fall eine Verschmelzung von $_GET und $_POST, wobei letzteres Vorrang hat. Wenn Sie sich nicht zu sehr an der URL-Injektion von Parametern über den Query-String stören, ist dies recht praktisch.