Andavos: Magic quotes gpc

Hallo,
also in der php.ini gibt es die Funktion magic_quotes_gpc, diese maskiert automatisch GET/POST/Cookie Daten.

Jetzt haben ich einen recht aufwendigen Script den jeder frei benutzen darf, allerdings werden da bei $_POST etc. der Text nicht per addslashes Maskiert.
Danach soll der Text in eine MySQL Tabelle gespeichert werden.

Sofern jetzt magic_quotes_gpc auf Off steht, und der User ein Anführungszeichen senden, wird es nicht gespeichert.

Mit magic_quotes_gpc = On
$aendern = "UPDATE tabelle Set spalte = 'Hallo 'Welt'' WHERE id = '1'";
$update = mysql_query($aendern);

Ohne magic_quotes_gpc
$aendern = "UPDATE tabelle Set spalte = 'Hallo 'Welt'' WHERE id = '1'";
$update = mysql_query($aendern);

Das ist klar das man so einen MySQL Fehler erhählt, er verändert den Wert dann nicht.

Gut dachte ich mir, jetzt packst du vor jeder Abfrage einmal addslashes() allerdings macht da der Script zicken, wenn magic_quest_gpc = On ist, denn dann wird der Text doppelt maskiert:

Mit magic_quotes_gpc = On und addslashes
$aendern = "UPDATE tabelle Set spalte = 'Hallo \'Welt\'' WHERE id = '1'";
$update = mysql_query($aendern);

Das führt dann zu einer sehr Unschönen Ausgabe nachher, nämlich: Hallo 'Welt'
obwohl der user nur Hallo 'Welt' geschrieben hat.

Also geht das ohne weiteres auch nicht.

Naja wie gesagt es ist ein recht komplexer Script mit recht vielen Abfragen, dieser basierd auf Grund von Wissenheit darauf, das magic_quotes_gpc = On ist, was bei den meisten der Fall ist.

Allerdings möchte ich das möglichst kompatibel halten und suche eine Lösung womit ich das Problem recht schnell beheben kann.

Mit:
get_magic_quotes_gpc()

kann man überprüfen ob der Wert On oder Off ist, leider fehlt die passende Funktion:
set_magic_quotes_gpc()

Hat jemand evt. ne andere Idee wie ich in dem Fall das es auf Off steht "umschalten" kann.

Wenn es auf Off steht müsste vor jeder $_POST Abfrage einfach addslashes() stehen, bzw. müsste die Funktion für die dauer des Scriptsablaufes auf On stehen.

Gibts da irgendwie ne Möglichkeit sie innerhalb des Scriptes auf On zu stellen, obwohl in der php.ini sie auf Off gesetzt wurde?

MFG
Andavos

  1. Hallo,
    hmm die Kommentare im Manual sind echt gut:
    http://de.php.net/manual/de/function.get-magic-quotes-gpc.php

    If you have written for having this option disabled:
    ---------------------------------------------------------------------

    if (get_magic_quotes_gpc()) unfck_gpc();

    function unfck($v) {
       return is_array($v) ? array_map('unfck', $v) : stripslashes($v);
     }

    function unfck_gpc() {
       foreach (array('POST', 'GET', 'REQUEST', 'COOKIE') as $gpc)
       $GLOBALS["_$gpc"] = array_map('unfck', $GLOBALS["_$gpc"]);
     }

    ---------------------------------------------------------------------
    If you have written for having this option enabled:
    ---------------------------------------------------------------------

    if (!get_magic_quotes_gpc()) unfck_gpc();

    function unfck($v) {
       return is_array($v) ? array_map('unfck', $v) : addslashes($v);
     }

    function unfck_gpc() {
       foreach (array('POST', 'GET', 'REQUEST', 'COOKIE') as $gpc)
       $GLOBALS["_$gpc"] = array_map('unfck', $GLOBALS["_$gpc"]);
     }

    MFG
    Andavos

  2. Hallo Andavos,

    Jetzt haben ich einen recht aufwendigen Script den jeder frei benutzen darf, allerdings werden da bei $_POST etc. der Text nicht per addslashes Maskiert.

    *pfui* sowas ist virtueller Selbstmord. Du darfs _nie_ und unter _keinen_ Umständen Daten die vom User kommen verwenden (oder gar in eine Query einbauen) ohne sie überprüft und "entschärft" zu haben!

    Ohne magic_quotes_gpc
    $aendern = "UPDATE tabelle Set spalte = 'Hallo 'Welt'' WHERE id = '1'";

    was passiert an dieser Stelle, wenn der User als Wert »' #« eingibt? Richtig, im Query steht dann
      UPDATE tabelle Set spalte = '' #' WHERE id = '1'

    • und da # einen Kommentar einleitet, wird alles dahinter ignoriert und der Query
        UPDATE tabelle Set spalte = ''
      wird ausgeführt (dass damit in jeder Zeile die Spalte »spalte« geleert wird, dürfte klar sein).

    $update = mysql_query($aendern);

    Fehlerbehandlung? (->mysql_error())

    Gut dachte ich mir, jetzt packst du vor jeder Abfrage einmal addslashes()

    nein, das ist auch falsch, um Daten für einen Query zu entschärfen gibt es mysql_escape_string().

    allerdings macht da der Script zicken, wenn magic_quest_gpc = On ist, denn dann wird der Text doppelt maskiert:

    dann prüf vorher ob magic_quotes_gpc gesetzt ist und wende addslashes an wenn get_magic_quotes_gpc() 0 zurückgibt (wobei addslashes() ja sowieso die falsche Funktion ist s.o.).

    Naja wie gesagt es ist ein recht komplexer Script mit recht vielen Abfragen, dieser basierd auf Grund von Wissenheit darauf, das magic_quotes_gpc = On ist, was bei den meisten der Fall ist.

    magic_quotes_gpc ist dazu da, solche Dummheiten abzufangen, und nicht dazu sich darauf zu verlassen.

    Hat jemand evt. ne andere Idee wie ich in dem Fall das es auf Off steht "umschalten" kann.

    auf http://de3.php.net/ini_set steht bei magic_quotes_gpc der Wert PHP_INI_PERDIR, d.h. die Einstellung kann zwar für ein Verzeichnis (.htaccess) geändert werden, nicht aber im Script selbst.

    Grüße aus Nürnberg
    Tobias

    1. Hallo,

      UPDATE tabelle Set spalte = '' #' WHERE id = '1'

      Das geht aber nur wenn magic_quest_gpc auf Off steht, wenn es auf On steht sieht es so aus:
      UPDATE tabelle Set spalte = '' #' WHERE id = '1'

      In Zeile 1 der Tabelle steht dann: ' #  <= Ausgabe von phpMyAdmin

      Aber du hast recht, so kann man MySQL Injections machen, wenn es auf Off steht, darum will ich es ja Standardmäßig bei jedem auf On haben.

      Wenn es auf On steht, kann man so _keine_ MySQL-Injection machen, denn es wird ja noch maskiert.

      nein, das ist auch falsch, um Daten für einen Query zu entschärfen gibt es mysql_escape_string().

      Dafür ist es jetzt auch zu spät :p
      Aber viel mehr als addslashes() macht die Funktion auch nicht

      magic_quotes_gpc ist dazu da, solche Dummheiten abzufangen, und nicht dazu sich darauf zu verlassen.

      Als ich damit Angefangen habe den Script zu programmieren, wusste ich noch nicht das es die Einstellung gibt (man lernt mit der Zeit).
      Aber in neueren Script benutze ich immer mysql_real_escape_string bzw. mylsq_escape_string.

      Aber für den Script ist es zu spät (zuviele Zeilen mit zuvielen Post und Get Abfragen).

      Das Wbb2.1.3 benutzt die Funktion addslashes() um die Abfragen zu "filtern".

      Damit es nicht doppelt maskiert wird, werden $_POST-Abfragen per stripslashes() behandelt, wenn magic_quotes_gpc auf ON steht.

      P.S. Sry für die Rechtschreinfehler, hab tierische Kopfschmerzen :/

      MFG
      Andavos

      1. Hallo Andavos,

        UPDATE tabelle Set spalte = '' #' WHERE id = '1'
        Das geht aber nur wenn magic_quest_gpc auf Off steht, wenn es auf On steht sieht es so aus:
        UPDATE tabelle Set spalte = '' #' WHERE id = '1'

        klar, aber wenn mqg dann wirklich mal auf off steht, ist eben alles zu spät ...

        Aber du hast recht, so kann man MySQL Injections machen, wenn es auf Off steht, darum will ich es ja Standardmäßig bei jedem auf On haben.

        nein. Du möchtest mysql_escape_string() verwenden (und zusätzlich bei mqg=on noch stripslashes())

        Aber viel mehr als addslashes() macht die Funktion auch nicht

        aber im Ernstfall kann das bischen vielleicht entscheidend sein ...

        Aber für den Script ist es zu spät (zuviele Zeilen mit zuvielen Post und Get Abfragen).

        dann musst duu das Script eben komplett umschreiben (oder einstampfen) - aber nicht weiterverteilen.

        Das Wbb2.1.3 benutzt die Funktion addslashes() um die Abfragen zu "filtern".

        das ist kein Grund es genauso falsch zu machen (btw: warum haben die Boards wohl ständig irgendwelche Sicherheitslöcher ...?)

        Grüße aus Nürnberg
        Tobias