2009-07-20 12 views
9

Ich schreibe eine Reihe von PHP-Skripten, die in einigen verschiedenen Setups ausgeführt werden, einige von ihnen geteilt Hosting mit magischen Zitaten auf (der Horror). Ohne die Möglichkeit, die PHP- oder Apache-Konfiguration zu steuern, kann ich in meinen Skripten alles tun, um PHP-Anführungszeichen zur Laufzeit zu deaktivieren?Wie kann ich PHP magische Anführungszeichen zur Laufzeit deaktivieren?

Es wäre besser, wenn der Code nicht annehmen würde, dass magische Anführungszeichen aktiviert sind, so dass ich dieselben Skripte auf verschiedenen Hosts verwenden kann, die magische Anführungszeichen haben oder auch nicht.

Antwort

15

Nur magic_quoted_runtime kann zur Laufzeit deaktiviert werden. Aber magic_quotes_gpc kann nicht zur Laufzeit deaktiviert werden (PHP_INI_ALL änderbar bis PHP 4.2.3, seitdem PHP_INI_PERDIR); Sie können sie nur entfernen:

if (get_magic_quotes_gpc()) { 
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST); 
    while (list($key, $val) = each($process)) { 
     foreach ($val as $k => $v) { 
      unset($process[$key][$k]); 
      if (is_array($v)) { 
       $process[$key][stripslashes($k)] = $v; 
       $process[] = &$process[$key][stripslashes($k)]; 
      } else { 
       $process[$key][stripslashes($k)] = stripslashes($v); 
      } 
     } 
    } 
    unset($process); 
} 

Weitere Informationen Disabling Magic Quotes sehen.

+0

Das sieht gut aus, danke! –

+2

Ich glaube wirklich, dieser Code sollte auch 'ini_set ('magic_quotes_gpc', false);' um eine andere Bibliothek, die auch daran interessiert war, die Eingabewerte zu entfernen, daran hindern, sie wieder zu entfernen. – gnarf

+1

@gnarf: Das wäre süß, aber leider funktioniert es nicht so, wenn du 'ini_set ('magic_quotes_gpc', 0)' tust, bekommst du 'false' jedes Mal, da dies nur in' PHP_INI_PERDIR' möglich ist. –

0

Es kann nicht zur Laufzeit erfolgen :(

5

Magic Quotes kann zur Laufzeit nicht deaktiviert werden, aber Sie können eine .htaccess-Datei im Verzeichnis zu deaktivieren.

php_flag magic_quotes_gpc off 

Der einzige wirkliche Vorteil Dies ist, dass Sie es einmal in ein Verzeichnis stellen können und es für das gesamte Verzeichnis und Unterverzeichnisse funktioniert.Sehr nett, wenn Sie dies für eine Anwendung brauchen, die Sie nicht geschrieben haben und es ohne magische Anführungszeichen zum Laufen bringen müssen.

+0

Interner Serverfehler. Sieht so aus, als ob der Host diese Anweisung nicht zulässt. :( –

+1

Ja, dies erfordert, dass der Server eingerichtet wird, um .htaccess override zuzulassen. Es tut mir leid zu hören, dass es für Sie nicht funktioniert. – MacAnthony

2

Ich habe ein kleines Skript dafür ähnlich wie Gum bos (aber natürlich Ich mag mein besser :):

if(function_exists('get_magic_quotes_runtime') && get_magic_quotes_runtime()) 
    set_magic_quotes_runtime(false); 

if(get_magic_quotes_gpc()) { 
    array_stripslashes($_POST); 
    array_stripslashes($_GET); 
    array_stripslashes($_COOKIES); 
} 

function array_stripslashes(&$array) { 
    if(is_array($array)) 
     while(list($key) = each($array)) 
      if(is_array($array[$key])) 
       array_stripslashes($array[$key]); 
      else 
       $array[$key] = stripslashes($array[$key]); 
} 
+1

Sehr nützlich als temporäre Lösung vor 5.3 Update (mit Standardkonfiguration dieser Anweisung) keine anderen Code-Änderungen erforderlich Nice.Thank you. – Fanda

+0

... aber was ist mit der Situation, wo Sie Inhalte POST sind, die Schrägstriche enthält, die bereit sind, da zu sein, und Sie nicht möchten, dass sie entfernt werden? – dsdsdsdsd

+1

@ ddsdsdsdsd: Handled .Schrägstriche werden nur entfernt, wenn "magic_quotes_gpc" aktiviert ist. In Ihrer Situation werden die Schrägstriche daher selbst zitiert und durch diesen Code wieder in nicht-quotale Schrägstriche umgewandelt. – chaos

1

Eine andere Lösung für PHP 5.3+:

if (get_magic_quotes_gpc() === 1) 
{ 
    $_GET = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_GET, JSON_HEX_APOS | JSON_HEX_QUOT))), true); 
    $_POST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_POST, JSON_HEX_APOS | JSON_HEX_QUOT))), true); 
    $_COOKIE = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_COOKIE, JSON_HEX_APOS | JSON_HEX_QUOT))), true); 
    $_REQUEST = json_decode(stripslashes(preg_replace('~\\\(?:0|a|b|f|n|r|t|v)~', '\\\$0', json_encode($_REQUEST, JSON_HEX_APOS | JSON_HEX_QUOT))), true); 
} 

Griffe Schlüssel, Werte und multidimensionalen Arrays.

+1

Dies funktioniert, aber es entfernt auch die Schrägstriche von anderen maskierten Zeichen wie \ r und \ n und wird zu "r" und "n" im Wert. –

+0

@Brian E: Vielen Dank für Ihr Feedback, Sie haben Recht - ich habe dieses große Detail vermisst! –

+0

@Brian E: Ich habe eine mögliche Lösung in https://github.com/alixaxel/phunction/issues/1#issuecomment-1039664 veröffentlicht. –

Verwandte Themen