Daten aus Kontaktformular

Hallo,
ich hätte eine Verständnisfrage was es die Übertrageung der Daten aus einem Kontaktformular angeht. Das Formular ist eine PHP-Datei in der die Eingaben der User geprüft werden und dann an die in der Datei unter einer Variablen angegebene Email-Adresse geschickt werden. Kein Cross-Site-Scripting. Wenn jemand die Daten aus dem Kontaktformular abfangen und an eine andere Email-Adresse schicken will, hat er eine Chance bei dem o.g. Formular? Er müßte doch Code in den Header der Email einschleusen? Bin ich sicher, wenn die Daten der User um Backslashes bereingt werden und solst alles zugelassen ist?

Gruß
Kukuruz

Hallo,
ich hätte eine Verständnisfrage was es die Übertrageung der
Daten aus einem Kontaktformular angeht.

ok

Das Formular ist eine PHP-Datei in der die Eingaben der User geprüft
werden und dann
an die in der Datei unter einer Variablen angegebene
Email-Adresse geschickt werden.

Standart oder?

Wenn jemand die Daten aus dem Kontaktformular abfangen und an
eine andere Email-Adresse schicken will, hat er eine Chance
bei dem o.g. Formular?

Wie meinst du das??Das jemand die Datei häckt oder sie einsehen kann?

Er müßte doch Code in den Header der
Email einschleusen?

Welchen Code?

Bin ich sicher, wenn die Daten der User um
Backslashes bereingt werden und solst alles zugelassen ist?

Wie?Willste alle Backslashes wegmachen?

Hallo,

Wenn jemand die Daten aus dem Kontaktformular abfangen und an
eine andere Email-Adresse schicken will, hat er eine Chance
bei dem o.g. Formular? Er müßte doch Code in den Header der

Welchem ? Ein Stück PHP Code wäre ggfs. hilfreich, um zu sehen, was du alles abfängst.

Email einschleusen? Bin ich sicher, wenn die Daten der User um
Backslashes bereingt werden und solst alles zugelassen ist?

Warum Backslashes ? In dem Fall sind Zeilenschaltungen (ASCII 10, 13 oder \n, \r als Zeichen in PHP) viel interessanter…

FAQ:2435

Alexander

ich denke genau darum geht es…
mail()

Bei der Verwendung der Mailfunktion ist es wichtig, Daten, welche als Subject oder als Header („From:“) verwendet werden, auf Sonderzeichen \r und \n (Zeilenumbrüche) zu prüfen. Angreifer senden gern als Subject oder Absendermail Text\nBcc: Mailadresse\nBcc:… Bei ungeprüftem Einsetzen von Subject und/oder Header lässt sich damit das Script zum Versenden vom Spam missbrauchen, da die zusätzlichen Bcc: Zeilen als zusätzliche Empfänger interpretiert werden.

Warum Backslashes ? In dem Fall sind Zeilenschaltungen (ASCII
10, 13 oder \n, \r als Zeichen in PHP) viel interessanter…

Backslashes sind jeweils vor \n und \r - damit ist ein einzelnes n bzw r kein carriage return o.ä. mehr sondern nurnoch ein Buchstabe.
Ich weiss nicht, wie das mit ASCII 10 und 13 ist und ob die dann letztlich nicht auch durch ein \n und/oder \r ersetzt werden.
Von daher wäre es einigermassen sicher…
denke ich :smile:

Warum Backslashes ? In dem Fall sind Zeilenschaltungen (ASCII
10, 13 oder \n, \r als Zeichen in PHP) viel interessanter…

Backslashes sind jeweils vor \n und \r - damit ist ein
einzelnes n bzw r kein carriage return o.ä. mehr sondern
nurnoch ein Buchstabe.

nö, wenn ich „\n“ poste kommt kein ‚\n‘, sondern chr(13) das ist also kein backslash, den du filtern kannst.

Hallo,
freut mich zunächst, dass ausser Dönerfans noch andere geantwortet haben, die Ahnung von der Materie haben.

Welchem ? Ein Stück PHP Code wäre ggfs. hilfreich, um zu
sehen, was du alles abfängst.

Hier sind die Code-Abschnitte auf die es mir ankommt:
$vorname = $_POST[‚vorname‘];
$name = $_POST[‚name‘];
$email = $_POST[‚email‘];

if(trim($vorname)=="") $err_text.=„Vorname fehlt.
„;
if(trim($name)==““) $err_text.=„Name fehlt.
„;
if(trim($email)==““) $err_text.=„Email-Adresse fehlt.
„;
else {
if(!ereg(“^[_a-z0-9-]+(.[_a-z0-9-]+)*@[a-z0-9-]+(.[a-z0-9-]+)*(.[a-z]{2,6})$“,$email))
$err_text.="Keine gültige E-Mail-Adresse.
";
}
$vorname = stripslashes($vorname);
$name = stripslashes($name);
$email = stripslashes($email);
Ich denke ab hier wird es interessant, weil hier zunächst die Bachslashes entfernt werden bevor die Daten in die kritischen Bereiche wie den Betreff und den Header der email kommen.

$email = strtolower($_POST[‚email‘]);
$to = „email-adresse“;
$subject =„Kontaktformular von $name“;
$header=„From: $email\n“;
$header.=„Reply-To: $email\n“;
$header.=„Content-Type: text/plain“
$text = „blabla \n“;

mail($to,$subject,$text,$header))

Email einschleusen? Bin ich sicher, wenn die Daten der User um
Backslashes bereingt werden und solst alles zugelassen ist?

Warum Backslashes ? In dem Fall sind Zeilenschaltungen (ASCII
10, 13 oder \n, \r als Zeichen in PHP) viel interessanter…

Dazu hat ja unten schon einer was geschrieben. Bisher dachte ich auch, dass ohne Backslasches, die nachfolgenden Befehle, d.h. Sonderzeichen nicht ausgeführt werden können. Oder wäre es hier besser mit trim() überflüssige Zeichen zu entfernen. Dann kenn ich noch strip_tags() mit dem alle HTML und PHP-Befehle entfernt werden. Habe mein Script selbst anhand eines Lehrbuches erstellt. Da ich kein Programmierer bin, war ich mir nicht sicher, ob ich an den betreffenden Stellen die richtigen Befehle verwendet habe.

Gruß
Kukuruz

mail()

Bei der Verwendung der Mailfunktion ist es wichtig, Daten,
welche als Subject oder als Header („From:“) verwendet werden,
auf Sonderzeichen \r und \n (Zeilenumbrüche) zu prüfen.
Angreifer senden gern als Subject oder Absendermail Text\nBcc:
Mailadresse\nBcc:… Bei ungeprüftem Einsetzen von Subject
und/oder Header lässt sich damit das Script zum Versenden vom
Spam missbrauchen, da die zusätzlichen Bcc: Zeilen als
zusätzliche Empfänger interpretiert werden.

Hallo MunicFreak,
genau das entspricht meinem Kenntnisstand. Mit BCC könnte jemand auch dafür sorgen, dass er eine Kopie des Kontaktformulars bekommt. Arbeite in einer Branche wo sehr viel Geld für Kundenadressen bezahlt wird. Weißt du vielleicht, ob ich es herausfinden kann, wenn jemand bcc: etc einschleust, d.h. bleiben irgendwo Spuren zurück? PHP-Scripte laufen ja nur auf dem Server und es stellt sich die Frage wie ich kontrollieren kann was dort passiert.

Ich weiss nicht, wie das mit ASCII 10 und 13 ist und ob die
dann letztlich nicht auch durch ein \n und/oder \r ersetzt
werden.

Bei ASCII 10 und 13 verstehe ich nur Bahnhof.

Gruß
Kukuruz

Hallo MunicFreak,
genau das entspricht meinem Kenntnisstand. Mit BCC könnte
jemand auch dafür sorgen, dass er eine Kopie des
Kontaktformulars bekommt. Arbeite in einer Branche wo sehr
viel Geld für Kundenadressen bezahlt wird. Weißt du
vielleicht, ob ich es herausfinden kann, wenn jemand bcc: etc
einschleust, d.h. bleiben irgendwo Spuren zurück? PHP-Scripte
laufen ja nur auf dem Server und es stellt sich die Frage wie
ich kontrollieren kann was dort passiert.

Hi,

möglicherweise hat der Mailserver ein Logfile, dass auch erfolgreiche Mails mitloggt. Du könntest alternativ, da du das Script ja eh selbst schreibst, von dem Script noch zusätzlich ein Logfile schreiben lassen.

Ascii 10 und 13 sind die Bezeichnung für zwei Elemente aus dem Ascii-Standard, nähmlich das 10. und das 13. (das sind wohl \n und \r).

ascii ist ein älterer Codesatz für die Übermittlung von Texten. Ich denke, wenn du in deinem Script tatsächlich nach „\n“ filterst bist du auf der richtigen Seiten.

Gruß Henrik

Hallo MunicFreak,

mit h bitte :wink:

genau das entspricht meinem Kenntnisstand. Mit BCC könnte
jemand auch dafür sorgen, dass er eine Kopie des
Kontaktformulars bekommt. Arbeite in einer Branche wo sehr
viel Geld für Kundenadressen bezahlt wird. Weißt du
vielleicht, ob ich es herausfinden kann, wenn jemand bcc: etc
einschleust, d.h. bleiben irgendwo Spuren zurück? PHP-Scripte
laufen ja nur auf dem Server und es stellt sich die Frage wie
ich kontrollieren kann was dort passiert.

also an Deiner Stelle würde ich einfach mal versuchen ein wenig zu spielen…
mach eine textarea als absender-email.
Wenn Du dann in deinem mail() Befehl
FROM: $absender
schreibst kannst Du versuchen, was passiert, wenn Du einen Zeilenumbruch einfügst und dann BCC: [email protected] eintippst.
Wenn Du dann einfach die variable $absender durch ein paar Tests laufen lässt und ggf bereinigst, dann sollte Dein Script ziemlich sicher sein.
z.B. einfach ein
$absender=str_replace(„BCC:“,"",$absender);
oder auch
$absender=str_replace("\n","",$absender);

Ich weiss nicht, wie das mit ASCII 10 und 13 ist und ob die
dann letztlich nicht auch durch ein \n und/oder \r ersetzt
werden.

Bei ASCII 10 und 13 verstehe ich nur Bahnhof.

http://de.wikipedia.org/wiki/ASCII
Wenn Du im Abschnitt „Kodierung“ liest findest Du den Hinweis, warum ich glaube, dass das hier irrelevant ist.
Zitat:
„Die Datenverarbeitung benutzt in der Regel 8 Bit oder ein Byte als kleinste Einheit zur Datenspeicherung.“
Damit wird ein \n auch nicht in ASCII übersetzt werden und Du brauchst keine zusätzliche Prüfung darauf…
Hier findest Du übrigens noch mehr dazu
http://www.robelle.com/library/smugbook/ascii.html
10 -> Line Feed (\n)
13 -> Carriage Return (\r)

Hallo,

besser:

$vorname = str\_replace(Array("\r", "\n"), "", stripslashes($vorname));
$name = str\_replace(Array("\r", "\n"), "", stripslashes($name));

Email einschleusen? Bin ich sicher, wenn die Daten der User um
Backslashes bereingt werden und solst alles zugelassen ist?

Vom Nutzer kommen keine Backslashes, bzw, selbst wenn der Nutzer \n dort eingibt, macht das nichts aus, da das ja auch als 2 Zeichen „“ und „n“ an das Mailprogramm übergeben wird (und dort ggfs. einen Fehler provoziert, weil die E-Mail Adresse ungültig ist, aber das ist ein anderes Problem).
Wenn du in einem String allerdings „\n“ schreibst, dann macht PHP daraus EIN Zeichen, nämlich das Zeichen für den Zeilenumbruch, welches man zum Beispiel auch einfach mit in einem Eingabefeld oder aber in einem String erzeugen könnte:

$test = "Das
ist
ein
Test";

und

$test = "Das\nist\nein\nTest";

sind identisch, im zweiten Fall wurden die Zeilenumbrüche durch Ersetzen des \n vom PHP eingebaut.

Und diese(s) Zeichen (es gibt 2 verschiedene, \n und \r) musst du abfangen…

Dazu hat ja unten schon einer was geschrieben. Bisher dachte
ich auch, dass ohne Backslasches, die nachfolgenden Befehle,
d.h. Sonderzeichen nicht ausgeführt werden können. Oder wäre
es hier besser mit trim() überflüssige Zeichen zu entfernen.

trim entfernt nur am Anfang und am Ende, ist daher nicht unbedingt geeignet.

Dann kenn ich noch strip_tags() mit dem alle HTML und
PHP-Befehle entfernt werden. Habe mein Script selbst anhand

Sofern du die nicht brauchst, ja. Wobei strip_tags machmal „böse“ sein kann, weil das alles in eckigen Klammern ersetzt, wenn dir also jemand ein Stück HTML-Code schicken will, oder auch mathematische Ungleichungen, besser weglassen.

Alexander

Hallo MunichFreak,

mit h bitte :wink:

gerne

also an Deiner Stelle würde ich einfach mal versuchen ein
wenig zu spielen…
mach eine textarea als absender-email.
Wenn Du dann in deinem mail() Befehl
FROM: $absender
schreibst kannst Du versuchen, was passiert, wenn Du einen
Zeilenumbruch einfügst und dann BCC:
[email protected] eintippst.

So, ich habe bißchen gespielt. Neben Absender ist es gar nicht möglich bcc oder sowas zuschreiben, weil dann die Fehlermeldung: keine gültige email-Adresse kommt. Offenbar wird das schon vom weiter oben geposteten Code zur Gültigkeitprüfung von email-adressen verhindert. Das ist schon mal gut. Bleibt jetzt noch das Feld Subjekt das ich ckecken muss.

Gruß
B.