Kontaktformular: Sicherheitslücken und technische Schwächen

  • Hallo,

    ich habe da auch mal ein Kontaktformular nach der PHP-Self-Methode erstellt und würde gerne mal wissen, ob Ihr dort noch Sicherheitslücken oder technische Schwächen drin erkennt:


    Ich weiss jedenfalls schon mal, dass dort noch ein "htmlcharsets" eingesetzt werden muss, damit das Formular bspw. nicht für Spam-Angriffe missbraucht werden kann.
    Ich weiss aber jetzt nicht genau, an welcher Stelle genau diese htmlcharsets eingesetzt werden müssen.
    Vielleicht könnt Ihr mir da ja helfen.

    Findet Ihr darin vielleicht sonst noch irgendwelche Fehler?


    Danke schon mal im voraus.


    Gruß
    anykey

    Drücken Sie die Any-Taste um fortzufahren!

    • Offizieller Beitrag

    Hallo,

    Sicherheitstechnisch fängt es schon mal beim PHP_SELF an. Das solltest Du nicht verwenden. Warum? Findet man alles im Netz und muss hier nicht nochmal durchgekaut werden.
    Weiterhin frage ich mich, warum Du das Formular zweimal erstellt hast? Etwa wegen der Fehlerausgabe?

    Dann solltest Du mail() nicht verwenden, sondern eher eine Mailer-Klasse á la PHPMailer oder SwiftMailer.

    Richtig filtern tust Du die Formulardaten auch nicht, Du versuchst lediglich herauszufinden, ob sich Mail-Header darin befinden.

    gruß Arne

  • Zitat von Arne Drews

    Findet man alles im Netz und muss hier nicht nochmal durchgekaut werden.

    Schade. Da ich davon von dir hier zum ersten mal überhaupt lese, wäre zumindest ein Link nicht schlecht.

    Gegen Mods kommt man nicht an, die haben immer Recht. Sind scheinbar nicht kritikfähig.

  • Danke
    Also ist ein Aufruf wie dieser Mist?

    PHP
    <?php
        echo "<form action='".$PHP_SELF."' enctype=\"multipart/form-data\" method='post'>";


    Was ist, wenn ich die Zieldatei als Variable definiere und diese statt $PHP_SELF angebe?
    Ich verstehe diese Sicherheitslücke nicht wirklich.

    Gegen Mods kommt man nicht an, die haben immer Recht. Sind scheinbar nicht kritikfähig.

    • Offizieller Beitrag

    Hi,

    Je nachdem, was $PHP_SELF ist. So wie Du es schreibst, ist das eine stinknormale Variable, die Du generell dafür verwenden kannst.
    Wichtig ist halt, dass hier nicht $_SERVER['PHP_SELF'] dahinter steckt.

    Zitat von Gastl

    Schade. Da ich davon von dir hier zum ersten mal überhaupt lese, wäre zumindest ein Link nicht schlecht.

    Naja, wie ich schrieb, findet man das bei Google bspw. zu Hauf beschrieben und den Link zu Google muss ich ja wohl hier nicht posten!
    Grundsätzlich gilt für $_SERVER['PHP_SELF'], dass es sich hierbei um eine Reflektion der URL handelt und die kann man manipulieren und im worst case damit effektive XSS-Exploits schaffen.
    Bevor man jetzt anfängt, um PHP_SELF Pseudo-Sicherheit zu basteln, kann man auch einfach mit standardisierten Abläufen arbeiten, Stichwort: Affenformular.

    Bei einem Affenformular ruft sich die Formularseite selbst auf, genau wie es bei PHP_SELF gedacht ist.
    Nur kann man in Zeiten von HTML5 das action-Attribut komplett weg lassen, was zur Folge hat, dass das Formular seinen Selbstaufruf "sicher" durchführt und wir keinen Stress haben irgendetwas wie PHP_SELF absichern zu müssen, was seit Jahren nicht mehr notwendig ist.

    Gruß Arne


    EDIT: Kleiner Tipp noch:

    PHP
    echo "<form enctype=\"multipart/form-data\" method='post'>";


    Du sparst Dir die Maskierungsorgien, wenn Du PHP in SingleQuotes setzt:

    PHP
    echo '<form enctype="multipart/form-data" method="post">';
  • Danke für die Beiträge bis dahin.

    Ich hatte ja vorher auch schon probiert, die Eingaben zwischenspeichern zu lassen und den Absendevorgang erst auf der Folgeseite (mit der Absende-Bestätigung) durchführen zu lassen.

    Allerdings waren auf dem Weg dorthin die Variablen verloren gegangen, so dass beim Testen stets eine leere Mail in den Briefkasten geflattert ist.


    Gruß
    anykey

    Drücken Sie die Any-Taste um fortzufahren!

  • Aber wir können uns doch bestimmt darauf einigen, dass Sessions eine elegantere Lösung wären. 8)