Jens Simrock: Anforderungen an ein sicheres Formular

Hallo zusammen!

Ich benutze seit langem für die Erstellung von Kontaktformularen
den phpformgenerator. Weil ich kein Programmierer bin,
ist dies eine sehr hilfreiche Krücke für mich, Mailformulare auf
PHP-Basis erstellen zu lassen und dabei Pflichtfelder festlegen zu
können, simple Plausibilitätsprüfungen zu haben etc.

Nur liest man ja immer wieder, dass gerade einfach gestrickte
Kontaktskripte zum Massenversand von Spam missbraucht werden.
Ich frage mich jetzt, was macht ein "sicheres" Skript aus und
wo finde ich Informationen darüber, wie man seine Skripte sicher
bekommt? Und wie groß ist die Gefahr überhaupt?

Wäre für Hinweise oder Links dankbar.

Jens

  1. Hi Jens,

    Ich frage mich jetzt, was macht ein "sicheres" Skript aus und
    wo finde ich Informationen darüber, wie man seine Skripte sicher
    bekommt? Und wie groß ist die Gefahr überhaupt?

    Recht sicher wird das ganze z.B. schon mal, wenn der User noch den Text (paar Zeichen halt) aus einer so dynamisch wie möglich generierten Grafik korrekt eingeben muss, die ein böses Skript so ohne Weiteres halt nicht auslesen bzw. interpretieren kann.

    Gruß Michi

  2. Moin!

    Hallo zusammen!

    Also... was der  phpformgenerator erzeugt wissen sicherlich ein paar Leute weniger als es Leute gibt, die über die "sichere" Verarbeitung von Formulardaten Bescheid wissen.

    Die zu stellenden Fragen sind:

    Erfolgt die Überprüfung serverseitig (z.B. durch PHP) oder browserseitig(Javascript). Letzteres ist nur für eine Benutzerhilfe gut, der Sicherheit dient es keineswegs, weil immer noch gesendet werden kann, was im Gusto des vermeintlichen Benutzeres oder eben des Angreifers liegt.

    Wie erfolgt die Weiterverarbeitung?

    Die üblichen Tricks sind nur Beispiele und geben lange nicht den gesamten Komplex wieder, zeigen aber unten deutlich um was es geht. Die Funktionen kannst und solltest Du bei http://de.php.net/de/ nachlesen, aber zur Vorsicht immer die englische Ausgabe http://de.php.net/en/ vergleichen, oft ist die deutsche Übersetzung schlecht oder unvollständig.

    Formulardaten, die nur ganze Zahlen enthalten dürfen:

    <input id="intZahl" name="intZahl" type="text" />
    <input id="decZahl" name="decZahl" type="text" />
    <input id="strString" name="strString" type="text" />

    PHP-Skript:

    $strError='';

    1. ganze Zahl:

    if (isset($_GET['intZahl'])) {
       $intZahl=(int)$_GET['intZahl'];
    } else {
       $strError.='Ganze Zahl nicht angegeben. ';
    }

    2. Dezimalzahl:

    if (isset($_GET['decZahl'])) {
       $intZahl=$_GET['decZahl']*1;
    } else {
       $strError.='Dezimalzahlzahl nicht angegeben. ';
    }

    3. Strings...
    sind ein wenig zu kompliziert für eine Schnelldarstellung

    http://www.php-resource.de/manual.php?p=ref.regex liefert Dir gute Anfangshinweise, die Funktionen kannst Du besser bei http://de.php.net/manual/de/ref.regex.php nachlesen.

    Jedoch solltest Du grob so vorgegehen:

    if (isset($_GET['strString'])) {
      if (ini_get('magic_quotes_gpc')) {
         $strString=stripslashes($_GET['strString']);
      } else {
         $strString=stripslashes($_GET['strString']);
      }
      #hier Feinprüfung mit regex,trimmen und so weiter
    } else {
       $strError.='Dezimalzahlzahl nicht angegeben. ';
    }

    if ($strError != '') {
       # Formular mit Fehler neu senden
       exit; #
    }

    weitere Verarbeitung

    Beim Eintrag in Datenbanken:

    $sql='SELECT spalte FROM table WHERE dies="'.mysql_real_escape_string($strString).'"';

    #Beim Versenden von Mails:

    $to = str_replace("\n",'',$to);
    $from = str_replace("\n",'',$from);
    $subject = str_replace("\n",'',$subject);

    Beim Anzeigen in Gästebüchern:

    $strString=strip_tags($strString);

    Beim Schreiben in aufrufbare oder (zu) includierende Dateien:

    $strString = str_replace("<?",'',$strString);
    $strString = str_replace("?>",'',$strString);

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
    1. Hallo, fastix!

      Erst einmal vielen Dank für deine ausführlichen Bemühungen!

      Also... was der  phpformgenerator erzeugt wissen sicherlich ein paar Leute weniger als es Leute gibt, die über die "sichere" Verarbeitung von Formulardaten Bescheid wissen.

      Das war auch mehr so ein Schuss ins Blaue, ob da evtl. schon jemand
      von konkreten Problemen weiß.

      Erfolgt die Überprüfung serverseitig (z.B. durch PHP) oder browserseitig(Javascript).

      Serverseitig.
      Allerdings ist mir schon nicht klar, wie/ob eine Plausibilitätsprüfung
      einen Sicherheitsgewinn darstellt.
      Ich hätte die Probleme an anderen Stellen vermutet. :-/

      Jens

      1. Moin!

        Das war auch mehr so ein Schuss ins Blaue, ob da evtl. schon jemand
        von konkreten Problemen weiß.

        Ja. Über welches der ca. 79236429349236 verschiedenen konkret möglichen Probleme möchtest Du etwas wissen? Die Frage ist nämlich: wie werden die Daten konkret weiterverarbeitet? Genau dann treten die Probleme nämlich erst auf. Un djede mögliche Weiterverarbeitung hat andere Anforderungen.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development
      2. Moin!

        Allerdings ist mir schon nicht klar, wie/ob eine Plausibilitätsprüfung
        einen Sicherheitsgewinn darstellt.

        Ja, Doch. Wenn ganz andere Daten kommen, als Du erwartest, dann kannst Du davon ausgehen:

        • Die eingehenden Daten sind _wahrscheinlich_ (nicht notwendig) Schrott
        • Seltener (naja, je nach Ansturm normaler Besucher...) handelt es sich um einen Angriff.

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Seminare, Training, Development