120 Stimmen

Was ist falsch an der Verwendung von $_REQUEST[]?

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?

0voto

Duncan Punkte 1920

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.

0voto

user953985 Punkte 1

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; 
    } 
  }
}

0voto

Arjan202 Punkte 1

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"] ...

0voto

simUser Punkte 665

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

-1voto

amh15 Punkte 305

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.

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