toscho.design

PHP: Magic Quotes entfernen

In manchen PHP-Versionen sind die sogenannten Magic Quotes aktiviert. Diese Einstellung maskiert die Zeichen ', " und \ in Nutzereingaben mit einem Backslash (\). Aus einem Request auf die Adresse /?a=b'c wird dann also $_GET['a'] = b\'c (wie addslashes() also). Damit soll bei schlechtem Code eine SQL-Injektion verhindert oder zumindest erschwert werden.

Das Handbuch listet die Nachteile auf:

  • Portabilität: Ob man Magic Quotes an- oder abgeschaltet erwartet: In beiden Fällen kann man den Code nicht ohne zusätzliche Kontrolle auf einem anderen System einsetzen.
  • Performance: Nicht alle maskierten Daten landen in einer Datenbank, deshalb müssen sie auch nicht alle so behandelt werden. Ein gezieltes addslashes() ist viel schneller.
  • Mehraufwand: Da bei vielen Daten die Maskierungen nur stören, muß man oft exzessiv mit stripslashes() herumbasteln.

Im WordPress-Forum hatte gestern jemand das Problem eingeschalteter Magic Quotes, die das Markup seiner Beiträge verschandelt haben.
Letztendlich hat er es im Backend seines Hosters abschalten können, aber in der Diskussion ist ein kleines Plugin entstanden, das vielleicht anderen hilft:

<?php 
/* 
Plugin Name: Remove Magic Quotes 
Description: Entfernt nutzlose Backslashes.
Version: 0.1 
Author: Thomas Scholz 
Author URI: http://toscho.de 
*/ 
RMQ::gpc_strip_slashes(); 
class RMQ {     
    static function gpc_strip_slashes() 
    { 
        if ( get_magic_quotes_gpc() ) 
        { 
            $_REQUEST = RMQ::array_map_recursive('stripslashes', $_REQUEST); 
            $_GET     = RMQ::array_map_recursive('stripslashes', $_GET); 
            $_POST    = RMQ::array_map_recursive('stripslashes', $_POST); 
            $_COOKIE  = RMQ::array_map_recursive('stripslashes', $_COOKIE); 
        } 
        return; 
    } 
    /** 
     * Deeper array_map() 
     * 
     * @param string $callback Callback function to map 
     * @param array $array Array to map 
     * @source http://www.sitepoint.com/blogs/2005/03/02/magic-quotes-headaches/ 
     * @return array 
     */ 
    static function array_map_recursive($callback, $array) 
    { 
        $r = array(); 
        if ( is_array($array) ) 
        { 
            foreach ( $array as $k => $v ) 
            { 
                $r[$k] = is_scalar($v) 
                    ? $callback($v) 
                    : RMQ::array_map_recursive($callback, $v); 
            } 
        } 
        return $r; 
    } 
}

Das ZIP-Archiv enthält eine Datei, die man einfach ins Plugin-Verzeichnis legt und dann im Backend aktiviert.

Ich benutze einen fast identischen Code in all meinen PHP-Scripten. Seltsam finde ich nur, daß er im WordPress-Code fehlt …

3 Kommentare

  1. emax am 08.04.2009 · 08:12

    Vielen Dank noch mal für Deine Hilfe!

    Vielleicht solltest Du im Artikel das "maskiert alle Nutzereingaben" mit "maskiert bei Eingaben Sonderzeichen wie z.B. Anführungsstriche" präzisieren, dann wäre es noch klarer.

  2. GwenDragon am 08.04.2009 · 10:05

    Daten sollte man selbst prüfen und sich niemals auf solche „Sicherheitsfunktionen“ wie Magic Quotes verlassen.

    Und das Escaping von Parametern bei SQL sollte das Datenbankmodul machen.

    Liegt wohl daran wie die Module zu PHP entstanden sind.

    Aber wirklich nützlich, der PHP-Schnippsel. Bei manchen Leuten werde ich das vielleicht auch mal brauchen.

  3. Thomas Scholz am 08.04.2009 · 12:01

    @emax: Danke, ich habe es angepaßt.

    @GwenDragon: Seit PHP 5.1.0 gibt es ja PDO::prepare(). Das erspart meistens die Suche nach datenbankspezifischen Maskierungsfunktionen.