Frank Fischer: Formularübergabe von " oder ' oder \ ?

Hallo,

ich habe ein Formular, was an eine PHP-Datei zur Auswertung geschickt wird. Dieses Formular enthält eine <textarea>. Wenn ich nun das Formular ausfülle und in der <textarea> " oder ' oder \ eingebe und das Ganze zur Vorschau schicke werden dann o.g. Zeichen mit \ maskiert.

Schicke ich den ganzen Kram dann in die Datenbank fehlt dann ein Teil vom Text aber nur, wenn ich " im Textfeld hatte.

Bsp:
Eingabe: hallo "ihr" forumler
vorschau: hallo "ihr" forumler
-> in die datenbank und wieder raus
ausgabe: hallo \

Wie kann man es verhindern, dass die Zeichen nicht maskiert werden (zumindest nicht sichtlich) bzw. dass nach Verwendung von " nicht der halbe Text fehlt ?

Danke
ff

  1. Hallo Frank,

    Wie kann man es verhindern, dass die Zeichen nicht maskiert werden (zumindest nicht sichtlich)

    http://dclp-faq.de/q/q-magic-quotes.html

    bzw. dass nach Verwendung von " nicht der halbe Text fehlt ?

    vor dem Einfügen den String mit http://de.php.net/mysql_escape_string "behandeln" - das solltest du sowieso _immer_ machen, bevor du einen String der vom Benutzer kommt in ein Query einbaust.

    Grüße aus Nürnberg
    Tobias

    --
    Selfcode: sh:( fo:) ch:? rl:( br:< n4:& ie:% mo:| va:) de:] zu:) fl:( ss:| ls:[ js:|
    1. Hello,

      Wie kann man es verhindern, dass die Zeichen nicht maskiert werden (zumindest nicht sichtlich)
      http://dclp-faq.de/q/q-magic-quotes.html

      bzw. dass nach Verwendung von " nicht der halbe Text fehlt ?
      vor dem Einfügen den String mit http://de.php.net/mysql_escape_string "behandeln" - das solltest du sowieso _immer_ machen, bevor du einen String der vom Benutzer kommt in ein Query einbaust.

      Das ist nur eine halbe Antwort.
      Du verwendest PHP mit der Einstellung magic_quotes_gpc = ON
      http://de2.php.net/manual/en/function.get-magic-quotes-gpc.php
      Dadurch werden bei Daten aus externen Datenquellen die Sonderzeichen " ' \ NUL automatisch maskiert, um einen allgemeinen Schutz für die Mehrzahl von Datenbanken zu gewährleisten. Die Datenbank darf diese Zeichen zwar speichern, aber ihre Schnittstelle, an der die Daten ja als Text übergeben werden, verkraftet das nicht.

      MySQL hat aber eine eigene Maskierung für seine Datenschnittstelle (Input).
      http://de2.php.net/manual/en/function.mysql-escape-string.php

      Um diese Maskierung anwenden zu können, müssen die daten erst ins Rohformat zurückkonvertiert werden, also die von PHP eingefügten Maskierungen beseitigt werden. In der DB sollen nämlich nur Rohdaten stehen, die im Normalformat sortierbar und suchbar (vergleichbar) sind. Um die Backslashes von PHP zu beseitigen, benutzt Du die Funktion http://de2.php.net/manual/en/function.stripslashes.php

      Das darf man natürlich nur tun, wenn get_magic_quotes_gpc() true ist.

      Da man die Magic_Quotes auch vor der Ausgabe an den Browser wieder entfernen muss, kann man sie entweder gleich ganz abschalten (aber da könnte man sich aus Vergesslichkeit schon mal eine Injektion einfangen) oder sie gezielt wieder entfernen:

      function strip($_data)
      {
        if (!get_magic_quotes_gpc())
        {
          return $_data;
        }

      if (is_array($_data))
        {
          foreach($_data as $key => $val)
          {
            $data[$key] = strip($val);
          }
        }
        else
        {
          $_data = stripslashes($_data);
        }

      return $_data;
      }

      Das geht am Besten gleich rekursiv für das ganze betroffene Datenarray:

      $_POST = strip($_POST);  # und weg sind sie, wennn sie denn da waren

      Nun kannst Du auf jeden Wert mysql_[real_]escape_string() anwenden:

      $sql= "insert into $table set ".
            "$text    = '".mysql_escape_string($_POST["feld1"])."',".
            "$zahl    = '".mysql_escape_string($_POST["feld2"])."',".
            "$logisch =  NULL";

      Alle Werte müssen (Texttypen)/dürfen (Numerische Typen) in Häkchen übergeben werden, NULL (für kein Wert vorhanden) muss ohne Häkchen als Literal dort stehen.

      Wenn man die DB wieder ausliest, sind die Maskierungen nicht mehr da, denn sie waren ja nur für die Schnittstelle bestimmt und wurden nicht mit abgespeichert.

      Aber die Sonderzeichen sind noch da. Die muss man vor der Ausgabe an HTML dann mit den HTML-Maskierungen http://de2.php.net/manual/en/function.htmlentities.php oder
      http://de2.php.net/manual/en/function.htmlspecialchars.php behandeln. Wenn der richtige Zeichensatz benutzt wird reichen meistens die htmlspecialchars().

      Ich hoffe, dass die Zusammenhänge nun etwas klarer sind.

      Liebe Grüße aus http://www.braunschweig.de

      Tom

      --
      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
      1. hi,

        Das ist nur eine halbe Antwort.
        Du verwendest PHP mit der Einstellung magic_quotes_gpc = ON
        http://de2.php.net/manual/en/function.get-magic-quotes-gpc.php
        Dadurch werden bei Daten aus externen Datenquellen die Sonderzeichen " ' \ NUL automatisch maskiert

        und du wiederum verallgemeinerst hier ein bisschen zu stark :-)

        magic_quotes_gpc bezieht sich, wie das kürzel am ende schon sagt, auf daten, die aus GET- oder POST-requests oder aus einem COOKIE kommen.

        die option hingegen, die sich noch allgemeiner auf "externe datenquellen" bezieht, ist magic_quotes_runtime, http://de2.php.net/manual/en/ref.info.php#ini.magic-quotes-runtime.

        gruss,
        wahsaga