Forum: PC-Programmierung "Sicheres" E-Mail-Formular allgemein (client/server)?


von www (Gast)


Lesenswert?

Ich möchte ein Kontaktformular auf allen (statischen) Seiten per 
JavaScript einbinden.
Serverseitig soll der Inhalt empfangen werden und wird dann an eine 
feste E-Mail-Adresse gesendet.

Ich stelle mir das etwa so vor:

1. Seite wird geladen
2. Javascript wird geladen und Formular erzeugt (ggf. gesicherte Daten 
geladen)
3. User gibt nachricht ein und löst Funktion aus
4. Formulardaten im Client speichern
5. Daten als XHR an den Server senden
6. Server prüft und bereinigt Daten
7. Server sendet mail
8. Server antwortet OK
9. Client empfängt OK und zeigt Bestätigung an
10. Client entfernt lokale Formulardaten

Wie macht man sowas allgemein? Was gibt es dabei zu beachten?

Fiesitäten:

- jemand (bot testet den Dienst) sendet mir hunderttausendmal etwas (= 
Spam, DoS?)
- Formulardaten enthalten Header etc., als Versuch, die E-Mail zu kapern 
und an andere Adressen zu senden
- ...

Gegenmaßnahmen:
- Senderate von Clients begrenzen (Server muss sich den Client merken - 
wie?)
- Client kann nur senden, wenn er zuvor die Seite gelanden hat (ein 
"Passwort") (Server muss sich den Client merken - wie?)
- Formulardaten "sicher" machen (wie?)
- ...

Ich bin damit sicher nicht der erste, wenn die Antworten auf meine 
Fragen also schon irgendwo beschrieben stehen, bitte gebt mir einen 
Link...

von ThomasW (Gast)


Lesenswert?

www schrieb:
> Ich stelle mir das etwa so vor:
>
> 1. Seite wird geladen
> 2. Javascript wird geladen und Formular erzeugt (ggf. gesicherte Daten
> geladen)
> 3. User gibt nachricht ein und löst Funktion aus
> 4. Formulardaten im Client speichern
> 5. Daten als XHR an den Server senden
> 6. Server prüft und bereinigt Daten
> 7. Server sendet mail
> 8. Server antwortet OK
> 9. Client empfängt OK und zeigt Bestätigung an
> 10. Client entfernt lokale Formulardaten

hau mal den Punkt 4 raus. Du brauchst nix speichern - die Daten stehen 
ja in den Eingabefeldern. Eine Wiederherstellung halte ich für unnötig - 
ein Kontaktformular ist doch immer nur für die schnelle Kontaktaufnahme. 
Ab da läuft die Kommunikation doch über andere Wege (E-Mail, Telefon, 
...).

übliche Gegenmaßnahmen gegen Spambots sind Captchas. Oder Versuche mit 
Eingabefeldern, die per CSS versteckt sind und von menschlichen Nutzern 
nicht ausgefüllt werden können. Da tummeln sich aber noch viele Ideen da 
draussen.

die Versuche deinen Mailer zu missbrauchen kannst Du nicht verhindern. 
Aber solange Du sicherstellst, dass die Eingabe immer nur als 
Plain-Text(!!) an dich geschickt wird, sollte das nur lästig aber 
ungefährlich sein.

von Tilo R. (joey5337) Benutzerseite


Lesenswert?

Punkt 1 bis 5 ist aus Security-Gesichtspunkten belanglos.
Ein Angreifer kann dir XML-HTTP-Requests ganz unabhängig von 
irgendwelchem Javascript davor schicken.

Ansonsten geht deine Denkweise in die richtige Richtung: Überlege, 
welche möglichen Bedrohungen es gibt.
Dann überlege dir, wie relevant sie sind und wie man sie kontert.

www schrieb:
> Fiesitäten:
>
> - jemand (bot testet den Dienst) sendet mir hunderttausendmal etwas (=
> Spam, DoS?)
> - Formulardaten enthalten Header etc., als Versuch, die E-Mail zu kapern
> und an andere Adressen zu senden
> - ...
>
> Gegenmaßnahmen:
> - Senderate von Clients begrenzen (Server muss sich den Client merken -
> wie?)
--> Rate Limiting. Berücksichtige dabei die IP des Senders, die 
Ziel-Emailadresse und die Anzahl insgesamt.
Es schadet auch generell nicht, wenn das Verschicken etwas dauert und du 
dabei eine offene HTTP-Verbindung erzwingst. Das erhöht den Aufwand auf 
Angreiferseite.

> - Client kann nur senden, wenn er zuvor die Seite gelanden hat (ein
> "Passwort") (Server muss sich den Client merken - wie?)
--> Google Cross-Site-Request-Forgery / XSRF-Token als Gegenmaßnahme
Üblich sind inzwischen auch Captchas.

> - Formulardaten "sicher" machen (wie?)
> - ...
--> alle eingehenden Daten peinlich genau validieren.

Weitere mögliche Bedrohungen:

Denkbar ist auch Code-Execution à la Shellshock, wenn du die eingehenden 
Daten nicht ausreichend validierst und quotest und zum Versand dann aber 
ein Shell-Programm aufrufst.

Ebenso könnte ein Angreifer versuchen, deinen Host auf eine 
E-Mail-Blacklist zu bekommen.

von www (Gast)


Lesenswert?

Das clientseitige Speichern kann als optionales Feature betrachtet 
werden, sollte m.M. aber öfter implementiert werden; wenn die Nachricht 
einfach verloren geht (Seite versehentlich verlassen, Fehler beim 
Absenden), ist das ärgerlich.

Eine weitere Überlegung zum Schutz vor Missbrauch, der über das 
client-tracking hinausgeht, wäre eine "nonce", die beim Laden des 
Formulars vom Server kommt - dann aber auch eine Zeitlang dort im 
Speicher gehalten werden muss. Das wäre sozusagen eine Session für das 
Formular.

Ein "Angreifer" müsste dann zumindest immer erstmal das Formular vom 
Server abrufen, die nonce erfassen, und dann mit dem Formular absenden.

von www (Gast)


Lesenswert?

oops, das hatte ich ja oben schon genannt.

von Εrnst B. (ernst)


Lesenswert?

Ganz wichtig: Email aus dem Formular nur an dich zustellen lassen, 
keine "Kopie an Absender"-Funktion!
Damit wird das Formular für SPAM-Versender uninteressant, und du kannst 
bei dir im Mail-Server und Client Filtern, bevor jemand damit belästigt 
wird.

Gefühlt benutzt aber niemand mehr ernsthaft solche Formulare, ich seh da 
immer nur SPAM und Bullshit reinlaufen...

von Gerd E. (robberknight)


Lesenswert?

Wenn nicht im Formular gleichzeitig noch sinnvolle Daten mit abgefragt 
werden (z.B. Kundennummer, Bestellnummer etc.), sondern nur Name, Firma, 
Telefonnr. etc. - was jeder eh so in seinem Email-Footer drin stehen 
haben muss - nervt so ein Formular wirkliche Interessenten nur.

Spammer juckt das dagegen nicht, die haben Bots die automatisch die 
Formularfelder erkennen und passend ausfüllen. Habe ich schon öfters 
gesehen, da kriegst Du dann alle 15 Minuten so eine Mail von dem 
Formular und da werden Dir dann blaue Pillen, Versicherungen, 
Reisekoffer und Schlankheitskuren angeboten.

Pack lieber Deine Kontaktemailadresse direkt mit mailto: verlinkt auf 
die Webseite.

Damit die nicht von Spammern abgegriffen wird, macht man das so:
- Darstellung nicht als Text, sondern mit einer eingebetteten Grafik
- der mailto:-Link ist nicht im Klartext drin, sondern ein Javascript, 
welches den echten Link mit ein paar Funktionen decodiert, z.B. Base64 
und ROT13 oder irgendwas in die Richtung. Wenn der Nutzer draufklickt, 
wird das Javascript aktiv, decodiert und öffnet den Link.

Diese Javascript-Obfuscation sorgt dafür, daß Spambots die nicht so 
einfach abgrasen können. War in der Praxis bisher ziemlich effektiv, das 
einen Programmierer anschauen zu lassen lohnt sich für die nicht.

von Bernd K. (prof7bit)


Lesenswert?

Gerd E. schrieb:
> Pack lieber Deine Kontaktemailadresse direkt mit mailto: verlinkt auf
> die Webseite.

Genau das!

Nichts ist nervtötender als in der Webseite rumstochern zu müssen um 
irgendwo das blöde Kontaktformular zu finden, dann seinen Text in ein 
viel zu kleines Eingabefeld reintippen in den man womöglich auch noch 
weder Absätze noch Aufzählungen machen kann (Ist das mit "bereinigen" 
gemeint?) und auf 130 Zeichen beschränkt ist, beim Abschicken nerven 
irgendwelche Pflichtfelder wo man das Geburtsdatum seiner Urgroßmutter 
väterlicherseits noch braucht und am Schluss kommt noch ein unlösbares 
Captcha und wenn man das vergeigt sind alle mühsam eingetippten Daten 
wieder weg weil der Webdesigner unfähig hoch 3 war und die simpelsten 
Sachen nicht vernünftig implementieren konnte.

Keiner will so etwas!

Jeder scrollt als erstes ganz nach unten und sucht nach der 
E-Mail-Adresse im Footer! Da klickt man dann drauf und der eigene 
wohlvertraute E-Mail Client geht auf! So funktionert das!

von sid (Gast)


Lesenswert?

ich halte da Javascript schon für den falschen Ansatz um ehrlich zu 
sein.
Javascripte sind dem Grundsatz nach Quelloffen,
heisst der "Angreifer" kann sie lesen, umschreiben (proxy rewrite) und 
schwupp macht das Script was ER will, nicht was DU willst.

Eine banale inhaltsprüfung (alle felder ausgefüllt, email im korrekten 
Format etc.) via Javascript macht sicherlich Sinn.
mehr "verarbeitung" sollte es dabei aber nicht geben mMn.
öffnet höchsten Möglichkeiten für Angreifer.

Die "sichere" post übertragung geht mit schlichtem SSL
Du kannst Angreifer über einen Session Cookie ausbremsen.
natürlich müssen alle post-übertragenen Daten geprüft und bereinigt 
werden im Zweifel.

Die Rückmeldung selber vom Server kann ja dann wieder über javascript 
erfolgen
(n json string via ajax und schwupp kein page reload)
Du kannst sicherlich wenn Du magst die eigentlichen Maildaten dem 
Browser via Javascript in den Storage schreiben.. ich frage mich zwar 
wofür, aber okay..
Anstelle deseen würde ich höchstens eine banale hashsumme des Contents
in den storage schreiben und prüfen ob der Anwender nicht grade versucht 
vierhunderttausendmal dasselbe zu senden
so liesse sich via javascript der sendeknopf blockieren.
Aber auch da wieder: javascript kann der anwender zu seinen gunsten 
ändern IMMER!!!

Also muss dieselbe Prüfung auf dem Server ebenfalls stattfinden.
(irgendn schneller hash .. sagen wir md5 nur um sicherzugehen man kann 
das server script vorzeitig beenden falls jemand unfug im Kopf hat)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.