Tom: Maskierungen, Backslashes und Häkchen in Formularen

Beitrag lesen

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