Spam-Gefahr durch Kontaktformulare

Kontaktformulare dienen dazu, einem eng definierten Personenkreis von einer Webseite aus Nachrichten zu senden. Die Empfänger-Adressen sind meist fix eingestellt und können vom Formular-Benutzer in der Regel nicht oder nur in engem Rahmen verändert werden. Zahlreiche Kontaktformular-Skripte sind fehlerhaft implementiert und können als Spam-Verteiler missbraucht werden.

Oft wird diese vermeintlich triviale Website-Funktion von Programmier-Anfängern umgesetzt, die keine Erfahrung mit der sicheren Web-Programmierung haben. Solche Skripte prüfen die Formular-Eingaben nicht auf unerlaubte Zeichen – dadurch können sie von Spammern als Spam-Verteiler missbraucht werden.

Abbildung
Grafische Darstellung der Methode

Was ist E-Mail-Header-Injection?
Die „E-Mail-Header-Injection“ ist eine Methode, E-Mail-Kopfzeilen über ein Kontaktformular-Skript in eine E-Mail zu „injizieren“. Spammer können auf diese Art Kontaktformular-Sendeskripte zum massenhaften Verteilen von Spam missbrauchen. Besonders ärgerlich für den Besitzer des Kontaktformulars ist, dass Spammer seine E-Mail-Adresse als Absender des Spams angeben können. Das geht zwar auch ohne ein fehlerhaftes Kontaktformular – nur in diesem Fall würde der Spam technisch gesehen tatsächlich vom Besitzer stammen.

Aufbau einer E-Mail
Eine E-Mail ist nichts weiter als eine Text-Datei mit einem bestimmten Aufbau. „From:“, „To:“ und „Subject“ gehören zu den E-Mail-Kopfzeilen (Header) der Nachricht. Der Header ist durch eine Leerzeile vom Inhalt der Nachricht getrennt. E-Mails von Kontaktformularen sehen ebenso aus, natürlich füllen die Skripte die Nachrichten mit den Daten vom Kontaktformular.

Missbrauch
Die beliebte Skriptsprache PHP bietet eine Funktion an, mit der E-Mails sehr einfach gesendet werden können. Die Syntax:

 $bool = mail( $empfaenger, $betreff, $inhalt, $header );

Oft prüfen Skripte die Eingaben vom Formular zu lasch oder überhaupt nicht. $empfaenger, $betreff, $inhalt und $header werden ohne weitere Behandlung einfach mit den Inhalten des Formulars befüllt, so wie es in folgendem Beispiel mit $absender der Fall ist.

      
        <?php

 $absender= $_POST['absenderemail']; $txt = $_POST['txt'];

 mail("rene@fsfe.de", "Mail vom Kontaktformular", $txt, "From: $absender\n");

?> <html> <head> <title>E-Mail senden</title> </head>

 <body> Die E-Mail wurde gesendet </body>
      

Negativbeispiel: So sollten E-Mails nicht gesendet werden

Die E-Mail-Adresse des Formular-Ausfüllers wird als Absender in die E-Mail geschrieben. Auf den ersten Blick kann niemand anderes als „rene@fsfe.de“ diese E-Mail bekommen, weil die Adresse fest in das Skript geschrieben wurde. Das ist falsch. Ein Spammer könnte mit einem eigenen Skript das Sende-Skript ansteuern und mit Formulareingaben vortäuschen. Diese Eingaben könnten zusätzliche E-Mail-Header enthalten. Zum Beispiel könnte als Absender folgendes Eingegeben werden:

      irgendjemand@irgendwo.xyz\nCc: spamopfer@sonstwo.xyz, nocheinopfer@anderswo.xzy
  

Das Zeichen „\n“ steht für eine neue Zeile. „Cc“ bedeutet „Carbon Copy“. Die E-Mail-Empfänger hinter „Cc“ erhalten diese Mail also als Kopie. Die fertig verarbeitete E-Mail würde dann so aussehen:

Abbildung

Manipulierte E-Mail

Diese E-Mail würde anstandslos nicht nur an rene@reneschmidt.de, sondern auch an spamopfer@sonstwo.xyz und nocheinopfer@anderswo.xzy gesendet werden. Ein Spammer würde als Absender natürlich nicht sich selbst angeben, sondern vielleicht Absender und Empfänger gleich setzen, so dass der Zorn der Spam-Opfer nicht ihn treffen würde. Dass bei einigen zehntausend auf diese Art gesendeten Spam-Mails ein gewisser, höchst unerfreulicher „Rücklauf“ zu erwarten ist, versteht sich von selbst.

Lösungen
Web-Programmierer müssen noch mehr auf Sicherheit bedacht sein, als „normale“ Anwendungsentwickler es ohnehin schon sein müssen. Ihre Programme stehen frei benutzbar „in der Wildnis“ des Internets herum. Das oberste Gebot eines jeden Web-Programmierers muss lauten: „Vertraue nichts und niemandem“. Daten, die ein Skript aus HTML-Formularen, POST/GET-Übergabeparametern oder sonstwoher erhält müssen grundsätzlich als potenziell gefährlich angesehen und vor der Verarbeitung „gesäubert“ werden. Eine „gesunde“ Portion Paranoia ist sehr hilfreich beim Web-Programmieren, auch wenn Auftraggeber oder Vorgesetzte manchmal schief gucken mögen.

Das oben gezeigte Beispiel ist einfach zu reparieren. In den Eingaben werden im folgenden Mini-Skript mittels preg_replace() alle nicht erlaubten Zeichen gelöscht. Zusätzlich werden bekannte Header-Felder wie „Cc:“ oder „Bcc:“ entfernt, um sicher zu gehen.

      
        <?php

 $absender = preg_replace( "/[^a-z0-9 !?:;,.\/_\-=+@#$&\*\(\)]/im", "", $_POST['absenderemail'] );

 $absender = preg_replace( "/(content-type:|bcc:|cc:|to:|from:)/im", "", $absender );

 $txt = preg_replace( "/(content-type:|bcc:|cc:|to:|from:)/im", "", $_POST['txt'] );

 mail("rene@reneschmidt.de", "Mail vom Kontaktformular", $txt, "From: $absender\n");

 ?>  <html> <head> <title>E-Mail senden</title> </head>

 <body> Die E-Mail wurde gesendet </body>
      

Besser eine spezialisierte Klassenbibliothek nutzen

Die so verarbeitete Mail ist im Angriffsfall vielleicht nicht mehr 100%ig Standard-Konform. Immerhin ist es nun erheblich schwieriger, das Skript zu missbrauchen. Der Nachrichteninhalt sollte noch um HTML-Tags bereinigt werden.

Besser ist es, nicht für jedes Kontaktformular das Rad neu zu erfinden. Auf Mail-Versand spezialisierte Klassenbibliotheken wie phpMailer vereinfachen die Verarbeitung erheblich, weil der grundlegende Programmcode wiederverwendet werden kann. Eine gute, noch weiter gehende Alternative wäre eine Kombination aus spezialisierter Klassenbibliothek und Template-System, wie sie das Yellow Duck-Framework anbietet. Dieses PHP-Framework kombiniert unter anderem das Template-System Smarty mit phpMailer und bietet weit reichende Validierungsfunktionen für HTML-Formulare an. ™

Die Links zum Thema:

Erstveröffentlichung am 19.12.2005

Sortiert nach:   neueste | älteste | beste Bewertung
kremer
Gast
kremer
7 Jahre 2 Monate her

kannst du mir helfen

trackback

[…] Bei dir l

trackback

[…] doch recht einfach absichern. Damit die SPAMmer nicht so einfach freies Futter finden, hier also eine Anleitung, wie ein Formular sehr einfach abgesichert werden kann — und dazu passend ein How-To zur Erstellung eines sicheres Kontaktformulars mit PHP und […]

trackback

[…] Spam-Gefahr durch Kontaktformulare | Formulare, Sicherheit, Spam | Dr. Web Magazin Web-Programmierer müssen noch mehr auf Sicherheit bedacht sein, als "normale" Anwendungsentwickler es ohnehin schon sein müssen. Ihre Programme stehen frei benutzbar "in der Wildnis" des Internets herum. Das oberste Gebot eines jeden Web-Programmierers muss lauten: "Vertraue nichts und niemandem". Daten, die ein Skript aus HTML-Formularen, POST/GET-Übergabeparametern oder sonstwoher erhält müssen grundsätzlich als potenziell gefährlich angesehen und vor der Verarbeitung "gesäubert" werden. Eine "gesunde" Portion Paranoia ist sehr hilfreich beim Web-Programmieren, auch wenn Auftraggeber oder Vorgesetzte manchmal schief gucken mögen. Tags: web formulare sicherheit skripte spam […]

internet
Gast
internet
6 Jahre 7 Monate her

Hallo,
eine banale Verständnisfrage:
Was bedeutet das „…/im“ am Schluß des regulären Ausdrucks?
preg_replace( „/[^a-z0-9 !?:;,.\/_\-=+@#$&\*\(\)]/im“, …
Franz Meier

trackback

[…] Spam-Gefahr durch Kontaktformulare […]

wpDiscuz

Mit der Nutzung unseres Angebots erklärst du dich damit einverstanden, dass wir Cookies verwenden. Weitere Informationen

Wir verwenden Cookies, um Inhalte und Anzeigen zu personalisieren, Funktionen für soziale Medien anzubieten und die Zugriffe auf unsere Website zu analysieren. Dadurch geben wir nicht personenbezogene Informationen zur Nutzung unserer Website an unsere Partner für soziale Medien, Werbung und Analysen weiter. Nähere Informationen findest du in unserer Datenschutzerklärung. Durch die Weiternutzung unserer Website (oder das ausdrückliche Klicken auf "Einverstanden") gehen wir davon aus, dass du mit der Verwendung von Cookies einverstanden bist.

Schließen