tk-zetel: Sicheres Speichern in einer MySQL Datenbank mit PHP

Hallo,

ich brauche mal Hilfe zum Thema PHP Sicherheit.

Ich erstelle zur Zeit eine Seite mit Netobjects11. Hier habe ich Formulare mit Eingabefeldern für z.B. Artikelerfassung, Registrierung usw. Die Daten werden in einer MySql-Datenbank gespeichert. Alles kein Problem,  nun geht es mir um die Sicherheit meiner Datenbank. Wie prüfe ich den Inhalt der Eingabefelder ob jemand mir etwas „Böses“ will, sprich die Datenbank auszuspionieren, irgendwelchen Php-Code einzuschleust usw. was es da nicht alles so gibt.

Zur Zeit habe ich das Speichern so aufgebaut:

<?php require_once('include_datenbank.php');   ?>

<?

$Artikelnummer = mysql_real_escape_string($_POST["Artikelnummer"]);
     $Datum = mysql_real_escape_string($_POST["Datum"]);
     $Email = mysql_real_escape_string($_POST["Email"]);
     $Firma = mysql_real_escape_string($_POST["Firma"]);

$eintrag="INSERT INTO Artikeldaten (Artikelnummer,Datum,Email,Firma)VALUES('$Artikelnummer','$Datum','$Email','$Firma',)";

?>

Das Speichern läuft zwar Fehlerfrei nur mit der Sicherheit ist es halt ein Problem.

Für einen Tipp wäre ich sehr dankbar.

Thomas

  1. Grüße,
    ergänze real_escape um striptags ? viel mehr macht man selten.
    MFG
    bleicher

    --
    __________________________-

    FirefoxMyth
    1. ergänze real_escape um striptags ?

      Wozu (an der Stelle)?

      1. Grüße,

        Wozu (an der Stelle)?

        quasi "für später" zum Zwecke der allgemeinen Sicherheit - die DB ist AFAIK durch escape schon ausreichend geschützt, nicht?
        MFG
        bleicher

        --
        __________________________-

        FirefoxMyth
  2. Wie prüfe ich den Inhalt der Eingabefelder ob jemand mir etwas „Böses“ will

    ...?
    In der Regel gar nicht*. Normalerweise reicht es aus, das Böse kontextgerecht unwirksam zu machen (beim speichern in einer MySql-Datenbank mit mysql_real_escape_string). Dazu gibt es einen neuen Artikel hier irgendwo auf selfhtml.

    * Wenn hier jemand z.B. den nach dem Befehl zum löschen einer Datenbank fragt, soll die Antwort ja auch nicht im Filter hängen bleiben.

    1. Dazu gibt es einen neuen Artikel hier irgendwo auf selfhtml.

      Da er "irgendwoer" war als ich gedacht hätte, hier noch die url:
      http://aktuell.de.selfhtml.org/artikel/php/kontextwechsel/

  3. hi,

    [..] Wie prüfe ich den Inhalt der Eingabefelder ob jemand mir etwas „Böses“ will,

    Ganz einfach: Filtere aus der Eingabe alle Zeichen raus, die nicht erlaubt sind.

    Hotti

  4. Hi!

    Wie prüfe ich den Inhalt der Eingabefelder ob jemand mir etwas „Böses“ will, sprich die Datenbank auszuspionieren, irgendwelchen Php-Code einzuschleust usw. was es da nicht alles so gibt.

    Da du nicht in der Lage sein wirst, eine genaue und allumfassende Definition von "Böses" zu erstellen - und garantiert auch keinen finden wirst, der das kann - kannst du nicht darauf prüfen. Ich würde auch nicht den umgekehrten Weg gehen, alles "Gute" durchzulassen. Dabei schränkst du regelmäßig oft auch viele Inhalte mit guten Absichten ein. Das einzige, was in jedem Fall funktioniert, ist, die Daten so zu notieren, dass sie der Empfänger eindeutig als Daten interpretieren kann und nicht durch die Fehlinterpretation von Daten als Steuerzeichen aus dem Konzept gebracht werden kann.

    Dabei kann man wie folgt vorgehen.
    Vorüberlegungen:

    • An welches System gebe ich die Daten aus (in diesem Moment - irgendwann später interessiert nicht. Das wird "später" betrachtet)?
    • Welche Zeichen haben eine besondere Bedeutung?
    • Wie notiere ich diese Daten so, dass sie diese Bedeutung verlieren und Daten bleiben?
    • Welche Hilfsmittel stellt mir mein System dafür bereit? (Siehe dazu meinen schon genannten Artikel zum Kontextwechsel, da habe ich versucht, die Methoden für die gebräuchlichsten Anwendungsfälle im Web-/PHP-Umfeld aufzuführen.)
      Wenn du diese Vorbetrachtungen geklärt hast:
    • Erstelle dein System entsprechend.
    • Suche nach Möglichkeiten, Unbeabsichtigtes einzuschleusen.
    • Malträtiere dein System damit. Nur keine Scheu, es ist nur ein Programm ohne Gefühle :-)

    Bei diesem Testen kannst du "provozierende" Daten verwenden, die für eine unmittelbare Tätigkeit interessant sein können (wie Speichern in einem DBMS) und solche, die später eine Auswirkung haben können (wenn sie irgendwann abgerufen werden). Die ersten Testdaten könnten es mit SQL-Injection probieren, die zweiten HTML-Code enthalten. Beide müssen beide Stufen unbeschadet überstehen und so wie eingegeben im Ausgabemedium zu sehen sein. Wenn das alles klappt, bist du schon aus dem Gröbsten raus. Doch das darf kein Ruhekissen sein. Wenn du dein System selbst administrierst, solltest du regelmäßig Veröffentlichungen zu Sicherheitslücken verfolgen, auf die du keinen direkten Einfluss hast - also die die in PHP, MySQL und so weiter enthalten sind.

    Ein Angreifer hat es nun - wenn alles richtig gemacht wurde - sehr schwer, ungewünschten Code unterzujubeln. Übrig bleiben unerwünschte aber unschädliche Inhalte, die du mit deinem Menschenverstand identifizieren musst und vermutlich beseitigen willst.

    Lo!