Frage

Ich sprach mit einem meiner Programmierer früher und er zeigte mir ein Stück Code, den er erwäge:

foreach($_REQUEST as $var=>$val) {
    $$var = addslashes($val);
}

Er wollte in der Lage sein $varName zu verwenden, anstatt zu schreiben von mit $_REQUEST['varName']

Ich riet ihm, die mysql_real_escape_string statt addSlashes zu verwenden und nicht die $_REQUEST Variablen auf den lokalen Stapel gelegt, weil die Hacker gibt ein anhängen Vektor. Für mich scheint, wie das gleiche Problem, dass die alte REGISTER_GLOBALS Richtlinie hatte.

Er sagte, es ist nicht das gleiche Sicherheitsrisiko, da diese Variablen alle auf dem lokalen Stapel wurden geschaffen. So war ich unsicher und ich ausgecheckt, die PHP Variable Variablen Seite an: http: //www.php.net/manual/en/language.variables.variable.php aber keinen Hinweis auf super-Globals und Sicherheit andere dann das Warnfeld sieht.

können Hacker leicht Vorteil dieses Konstrukts nehmen?

War es hilfreich?

Lösung

Das ist wie das Drehen zurück 6 Jahre PHP Sicherheitsverbesserungen ... Grundsätzlich register_globals und magic_quotes zusammen! Die beiden sind in den letzten Versionen von PHP als veraltet markiert und wird von zukünftigen Versionen, für sehr gute Gründe, entfernt werden.

Stellen Sie sich den folgenden Code:

if ($is_admin) {
    do_administrative_task();
}

Jetzt jemand macht die folgende Anfrage:

http://www.example.com/script.php?is_admin=1

Und einfach so, du bist Admin!

Ebenso addslashes() bietet keine wirklich keine Schutzmechanismen gegen SQL-Injection-Angriffe, weil es nicht moderne Zeichensätze nicht versteht. Es ist lächerlich einfach zu Handwerk etwas, das Bypass addslashes() und pwn Ihre Datenbank.

Andere Tipps

Ich habe nicht php in Jahren codiert, aber nicht da ist eine Funktion, die dies tut? Vielleicht genannt Extrakt ?

Es gibt ein paar Warnungen über diese Funktion mit Benutzern eingegebenen Daten unter Verwendung .. diese Warnungen als auch auf Ihr Code-Snippet gelten würden.

Der „lokale Stack“ hat nichts damit zu tun. Es läßt noch jemand eine neue Variable in einem Teil des Codes erstellen, dass der Programmierer nicht anctipated hat.

Wenn er wirklich will aus $_REQUEST und Make-Variablen von ihnen die Anfrageparameter nehmen alle, dann sollte er übertragen nur die, die der Code geht zu suchen und nicht mehr.

Und Graben addslashes(). Das ist nicht nur der falsche Ort eingehende Daten zu entkommen, aber die falsche Funktion auch.

Ja. Wenn die Anforderungs-URL enthält ...&GLOBALS[var]=1 dann wird es die entsprechende globale Variable überschreiben.

Er sollte zumindest in Betracht zieht folgendes Konstrukt für die Sicherheit:

 extract($_REQUEST, EXTR_PREFIX_ALL, "var_");  // or EXTR_SKIP

Dies wird die lokalisierte Variablen mindestens ein Präfix geben und von Globals nicht überschrieben. Für eine gute Maßnahme auch Verwendung array_map("addslashes", $_REQUEST) oder eine geeignetere Flucht Funktion. Aber wirklich, das ist nur magic_quotes durch einen anderen Namen. (Offtopic:. Versuchen mysql_query gehen zu lassen, aus und verwenden Sie PDO und vorbereitete Anweisungen, die einfacher und sicherer ist)

Right so! Als Programmierer in Frage gibt es tatsächlich drei Themen hier.

  1. Das $_REQUEST ist nicht unsicherer als $_GET oder $_POST gegeben, dass standardmäßig PHP $_COOKIES Vorrang vor $_GET und $_POST nimmt.
  2. Superglobal den Wert Einstellung ist sicherer als eine lokale Variable in einer Funktion oder einer Objektmethode lokale Variable.
  3. Endbenutzer erstellt Variable in einer Funktion ist global zugänglich.

Beginnen wir an der Spitze.

  1. $_POST und $_GET ist nicht sicherer als $_REQUEST. Alle Informationen aus einem Formular erhalten sind verschmutzt. Zeitraum. Ungeachtet. Wenn ich in gefälschten Cookies senden kann ich das Know-how zu fälschen POST Variablen. Das Argument ist strittig.
  2. Also haben wir eine lokale Variable nehmen wir mit $var. erstellen Der Umfang dieser Variablen ist nur in der Funktion / Methode. Setzt den Inhalt eines Superglobal auf den Wert der Benutzer gelieferten Daten sicherer als eine lokale Variable, die geschrubbt wird, wenn die Funktion / Methode Stapel gereinigt wird? Ich frage mich ...
  3. Werfen wir einen Schnipsel

function some_function() {
   foreach($_POST as $var=>$val) {
        $$var = $val; 
  }
}

Nun, wenn $_POST enthält eine Variable mit dem Namen _POST dieser Code eine lokale Variable $_POST gesetzt wird, den Wert enthält. Superglobals wird jedoch außer Kraft setzen diese und jede Bezugnahme auf $_POST die superglobalen, nicht die lokale Variable und als solche die lokale $_POST ist unrefereceable verweisen. Aufgrund dieser Funktionalität von PHP, ohne das globale Schlüsselwort es normalerweise unmöglich ist, vollständig außer Kraft zu setzen, die superglobalen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top