2008-10-21 11 views
16

Nach dem PHP manual, um Code mehr tragbar zu machen, empfehlen sie so etwas wie die folgenden zu entkommen Daten:Magic Quotes in PHP

if (!get_magic_quotes_gpc()) { 
    $lastname = addslashes($_POST['lastname']); 
} else { 
    $lastname = $_POST['lastname']; 
} 

ich andere Validierungsprüfungen, die ich durchführen, aber Wie sicher ist das Obige streng in Bezug auf Datenflucht? Ich habe auch gesehen, dass magische Zitate in PHP 6 veraltet sind. Wie wird sich das auf den obigen Code auswirken? Ich würde es vorziehen, nicht auf eine datenbankspezifische Escapefunktion wie mysql_real_escape_string() angewiesen zu sein.

Antwort

25

Magic Zitate sind inhärent gebrochen. Sie sollten die Eingabe in das PHP-Skript bereinigen, aber ohne zu wissen, wie diese Eingabe verwendet wird, ist es unmöglich, sie korrekt zu bereinigen. Wenn überhaupt, prüfen Sie besser, ob magische Anführungszeichen aktiviert sind, und rufen Sie dann stripslashes() für $ _GET/$ _ POST/$ _ COOKIES/$ _ REQUEST auf und bereinigen Sie Ihre Variablen dann an dem Punkt, an dem Sie sie irgendwo verwenden. Z.B. urlencode(), wenn Sie es in einer URL verwenden, htmlentities(), wenn Sie es auf eine Webseite drucken, oder wenn Sie die Escape-Funktion Ihres Datenbanktreibers verwenden, wenn Sie sie in einer Datenbank speichern. Beachten Sie, dass diese Eingabe-Arrays Unter-Arrays enthalten können, so dass Sie möglicherweise eine Funktion schreiben müssen, die in die Sub-Arrays zurückversetzt werden kann, um auch diese Schrägstriche zu entfernen.

Die PHP man page on magic quotes stimmt zu:..

„Diese Funktion ab PHP 6.0.0 DEPRECATED als PHP 5.3.0 und entfernt wurde, zu dieser Funktion Unter Berufung abgeraten wird Magic Quotes ist ein Prozess, der automatisch eingehenden Daten in das PHP-Skript entkommt. Es ist bevorzugt, mit magischen Anführungszeichen aus und stattdessen die Daten bei Runtime, wie erforderlich zu entkommen. "

+2

Außer dass PHP6 sah nie das Licht des Tages. – Rolf

+4

Entfernt in PHP 5.4 – hakre

1

Richtig, es ist nicht der beste Weg, es zu tun und nicht die sicherste. Flucht ist am besten in Bezug auf das, wofür du entkommst. Wenn es in einer mysql-Datenbank gespeichert werden soll, verwenden Sie mysql_real_escape_string, das andere Gebietsschemas und Zeichensätze berücksichtigt. Für HTML, HTML. Zur Verwendung im Code, escapeshellcmd, escapeShellarg. Ja, wahrscheinlich müssen Sie erst einmal rühren, wenn magische Anführungszeichen aktiviert sind. Aber am besten, sich nicht darauf zu verlassen oder es zu benutzen.

6

Ich verwende den folgenden Code in der Header-Datei von meiner Website, die Auswirkungen von magic_quotes zu umkehren:

<?php 

// Strips slashes recursively only up to 3 levels to prevent attackers from 
// causing a stack overflow error. 
function stripslashes_array(&$array, $iterations=0) { 
    if ($iterations < 3) { 
     foreach ($array as $key => $value) { 
      if (is_array($value)) { 
       stripslashes_array($array[$key], $iterations + 1); 
      } else { 
       $array[$key] = stripslashes($array[$key]); 
      } 
     } 
    } 
} 

if (get_magic_quotes_gpc()) { 
    stripslashes_array($_GET); 
    stripslashes_array($_POST); 
    stripslashes_array($_COOKIE); 
} 

?> 

Dann kann ich den Rest meines Code schreiben, als ob magic_quotes nie gegeben.

0

In Bezug auf die Verwendung einer datenbankspezifischen Escape-Funktion müssen Sie ziemlich viel tun. Ich habe gerade gefunden, addslashes() zu verwenden, um in seltenen Fällen mit MySQL zu scheitern. Sie können eine zu fliehende Funktion schreiben, die festlegt, welche DB Sie verwenden und dann die entsprechende Escapefunktion verwenden.

2

„Ich würde es vorziehen, nicht auf einer Datenbank spezifische entweichende Funktion wie mysql_real_escape_string() verlassen müssen“

Dann etwas wie PDO verwenden. Aber du musst den Schaden, der durch magische Zitate verursacht wird, umkehren.

17

Magic Zitate waren ein Designfehler. Ihre Verwendung ist nicht mit der Erhaltung Ihrer Gesundheit vereinbar.

Ich ziehe:

if (get_magic_quotes_gpc()) { 
    throw new Exception("Turn magic quotes off now!"); 
} 

keinen Code für die Kompatibilität mit von Natur aus gebrochen Setups schreiben Sie. Stattdessen verteidigen Sie ihre Verwendung mit Ihrem Code FAIL FAST.

+1

Super FAIL-FAST. Ich wusste nichts davon! – dynamic

0

können Sie dies versuchen:

if (get_magic_quotes_gpc()) { 
      $_REQUEST = array_map('stripslashes', $_REQUEST); 
      $_GET = array_map('stripslashes', $_GET); 
      $_POST = array_map('stripslashes', $_POST); 
      $_GET = array_map('stripslashes', $_COOKIES); 

    } 
2

eine Anforderung von PHP Put 5.2 oder höher auf Ihrem Code verwenden, filter API. Die filter_* Funktionen greifen direkt auf die Rohdaten zu (sie berühren niemals $_POST usw.), so dass sie von magic_quotes_gpc nicht betroffen sind.

Dann ist dieses Beispiel:

if (!get_magic_quotes_gpc()) { 
    $lastname = addslashes($_POST['lastname']); 
} else { 
    $lastname = $_POST['lastname']; 
} 

Kann dies werden:

0

Ihr Beispielcode rückwärts ist, sollten Sie folgendes tun:

if (get_magic_quotes_gpc()) { 
    $lastname = stripslashes($_POST['lastname']); 
} else { 
    $lastname = $_POST['lastname']; 
} 

Beachten Sie, dass diese Blätter Ihre Eingabedaten in einem "rohen" Zustand genau so, wie der Benutzer sie eingegeben hat - keine zusätzlichen Backslashes und möglicherweise mit S geladen QL Injection und XSRF-Attacken - und genau das wollen Sie. Dann stellen Sie sicher, Sie immer Verwendung eines der folgenden:

  • Wenn echo ing die Variable in HTML, wickeln Sie es in htmlentities()
  • Wenn es in mysql setzen, verwenden Sie vorbereitete Anweisungen oder auch mysql_real_escape_string() als Minimum.
  • Wenn echo ing die Variable in Javascritpt Code verwenden json_encode()

Joel Spolsky einige gute Ausgangs Beratung

0

Genau dies in Making Wrong Code Look Wrong hat auf der PHP manual pages gefunden über, sieht aus wie eine ziemlich kluge Weise em abzustreifen (beschäftigt sich mit Schlüssel und Werte ...):

if (get_magic_quotes_gpc()) 
{ 
    $_GET = json_decode(stripslashes(json_encode($_GET, JSON_HEX_APOS)), true); 
    $_POST = json_decode(stripslashes(json_encode($_POST, JSON_HEX_APOS)), true); 
    $_COOKIE = json_decode(stripslashes(json_encode($_COOKIE, JSON_HEX_APOS)), true); 
    $_REQUEST = json_decode(stripslashes(json_encode($_REQUEST, JSON_HEX_APOS)), true); 
    ini_set('magic_quotes_gpc', 0); 
} 
+1

Ich bin der Autor dieses Hinweises auf das Handbuch, nur nicht vergessen, dass, da wir die Konstante 'JSON_HEX_APOS' verwenden, diese Lösung nur mit PHP 5.3 und höher kompatibel ist, siehe diese Frage (http: // stackoverflow. com/questions/2077711/php-kürzer-magic-quotes-lösung) für weitere informationen. –