XHTMLforum

XHTMLforum (http://xhtmlforum.de/index.php)
-   Serveradministration und serverseitige Scripte (http://xhtmlforum.de/forumdisplay.php?f=80)
-   -   Mail-Formular-Problem (http://xhtmlforum.de/showthread.php?t=39732)

SPMan 28.04.2006 16:52

Mail-Formular-Problem
 
Hallo,
leider habe ich mich schon lange nicht mehr mit PHP beschäftigt. Aus
diesem Grund bin ich auch sehr aus der Materie heraus und ich hoffe
jemand vom Board kann mir helfen mein Script auf den neuesten
Stand zu bringen und anzupassen.
Bisher lief es immer einwandfrei, doch bei einem anderen Provider
funktionierte es nicht, wenn man dem Formular keine Mail-Adresse
mitgegeben hat. Dort hat es dann einen 404-Fehler gegeben.
Wenn ich hier ein anderes Posting und die Antwort des Providers richtig
interpretiere hat es mit der E-Mailinjection zu tun.

Zitat:

Zitat von Der Provider
In der Datei /.htaccess legen Sie eine Fehlerseite für den HTTP-Errorcode 500 fest auf http://www.testurl/500.html - diese Datei existiert jedoch nicht und bringt folglich 404. (Desweiteren beachten Sie bitte, dass die für 401 hier festgelegte URL so nicht gültig ist - vgl.
http://httpd.apache.org/docs/2.0/mod...#errordocument)

Der Statuscode 500 wird generiert, wenn die "From:" Angabe innerhalb der E-Mail keinen gültigen Wert (eine E-Mailadresse) enthält und deshalb das E-Mailsubsystem die so übergebene E-Mail ablehnt. Dieser Check ist Teil eines von uns entwickelten Mechanismuses, um unsere Kunden vor den Auswirkungen und Folgen von E-Mailinjection-Angriffen (vgl.
http://www.securephpwiki.com/index.php/Email_Injection) zu schützen, gegen welches Ihr Script auch anfällig ist. Sorgen Sie im ersten Schritt dafür dass sämtliche steuernden E-Mail-Headerfelder (To, From, Reply-To etc.) korrekt beschickt werden. Verwenden Sie beispielsweise als Absender, wenn der Besucher keine E-Mailadresse angibt, eine eigene wie z.B. no-reply@..... In einem weiteren Schritt sollten sie Plausibilitäts-Prüfungen aller im E-Mail-Header verwendeten Variblen (name, vorname etc.) implementieren, um somit Einfalltore für E-Mailinjection-Angriffe zu schließen.

Anbei findet ihr mein PHP-Script für die Mailabfrage.
Ich hoffe jemand von euch kennt sich mit dem Thema aus und kann mir weiter helfen um mein Script anzupassen zu können...

Mein Quelltext:
Code:

<?
// Angaben anpassen
$to_email='mail@testurl.de'; //Die Zieladresse
$mail_success='./versendet.html'; // Pfad zu einer Bestätigungsseite,
wenn die Mail erfolgreich versendet wurde.


$error=false;

// Hier werden alle Pflichtfelder festgelegt.
Diese Felder dürfen nicht leer bleiben.
$pflicht[]='name';
$pflicht[]='telefon';
$pflicht[]='nachricht';

$absendezeit = date('h-i-s, j-m-y');

if($_POST)
{
// prüfen, ob eines der Pflichtfelder leer ist
foreach($pflicht AS $key => $result)
{
if(!$_POST[$result])
{
${$pflicht[$key].'_error'}='Bitte ausfüllen';
$error=true;
}
}

// Prüfung der PLZ
$pattern_plz="/^[0-9]{5}$/";
if(!preg_match($pattern_plz,$_POST['plz']) && $_POST['plz']!='')
{
$plz_error='falsches Plz Format';
$error=true;
}

// Prüfung der Telefonnummer
$pattern_tel="/^[0-9-()/+.]*$/";
if(!preg_match($pattern_tel,$_POST['telefon']) && $_POST
['telefon']!='')
{
$telefon_error='falsches Format';
$error=true;
}

// Prüfung der Faxnummer
$pattern_fax="/^[0-9-()/+.]*$/";
if(!preg_match($pattern_fax,$_POST['telefax']) && $_POST
['telefax']!='')
{
$telefax_error='falsches
Format';
$error=true;
}

// Prüfung der E-Mail
if($_POST['email']!='')
{
function checkmail($email)
{
if (eregi("^[0-9a-z]([-_.]?[0-9a-z])*@[0-9a-z]
([-.]?[0-9a-z])*\.[a-z]{2,4}$", $email, $check))
{
if(getmxrr(substr(strstr($check
[0], '@'), 1), $validate_email_temp))
{
return true;
}
if(checkdnsrr(substr(strstr($check
[0], '@'), 1),"ANY"))
{
return true;
}
}
return false;
}

if(!checkmail($_POST['email']))
{
$email_error='falsches Format';
$error=true;
}
}

// Wenn keine Fehler vorhanden, dann kann die Mail versendet
werden
if(!$error)
{


$from_name="{$_POST['vorname']} {$_POST
['name']}";
$from_email=$_POST['email'];

$headers = "X-Sender: $from_name<$from_email>\n";
$headers .= "X-Mailer: $from_name powered by
SPMan\n";
$headers .= "Return-Path: <$from_email>\n";
$headers .= "Date: ". date('r'). "\n";
$headers .= "From: $from_email \n";
$headers .= "Sender: $from_email\n";
$headers .= "Reply-To: $from_email\n";
$headers .= "Organization: testurl.de\n";
$headers .= "X-MSMail-Priority: Normal\n";
$headers .= "Content-Type: text/plain\n";

$comment = $from_name.' aus '.$_POST
['plz'].' '.$_POST['ort'].' hat folgende Anfrage gesendet:'."\n\n";
$comment .= "Absendezeit: ".$absendezeit. "\n\n";
$comment .= "Anrede: ";
$comment .= $_POST['anrede']."\n";
$comment .= "Vorname: ";
$comment .= $_POST['vorname']."\n";
$comment .= "Name: ";
$comment .= $_POST['name']."\n";
$comment .= "Straße: ";
$comment .= $_POST['straße']."\n";
$comment .= "Plz: ";
$comment .= $_POST['plz']." ";
$comment .= "Ort: ";
$comment .= $_POST['ort']."\n";
$comment .= "Telefon: ";
$comment .= $_POST['telefon']."\n";
$comment .= "Telefax: ";
$comment .= $_POST['telefax']."\n";
$comment .= "E-Mail: ";
$comment .= $_POST['email']."\n";
$comment .= "Betreff: ";
$comment .= $_POST['betreff']."\n\n";
$comment .= "Nachricht:\n";
$comment .= $_POST['nachricht'];



// Inhalte für den Besucher

$comment2 = "Herzlichen Dank für Ihr Interesse an
TestURL.\n\nDie nachfolgende Nachricht wurde erfolgreich an uns
zugestellt.\n\nIhre Nachricht:\n";
$comment2 .= $_POST['nachricht']."\n\n";
$comment2 .= "Wir werden uns schnellstmöglich mit Ihnen in
Verbindung setzen.\n";
$comment2 .= "Ihr TestURL Team\n\n";

$comment2 .= "==========================================
=============\n\n";
$comment2 .= "Manfred Mustermann\n";
$comment2 .= "Muetserstr. 1\n";
$comment2 .= "00815 Musterhausen\n\n";
$comment2 .= "Telefon: xxxx - xxxxxx\n";
$comment2 .= "Telefax: xxxx - xxxxxx\n";
$comment2 .= "Mobil: xxxx - xxxxxx\n";
$comment2 .= "E-Mail: mail@testurl.de\n";
$comment2 .= "Internet: www.testurl.de";

if(mail($to_email,$_POST
['betreff'],$comment,$headers))
{

@mail($from_email,$_POST
['betreff'],$comment2,$headers);
header("LOCATION: $mail_success");
}
}

}
?>

Das Problem wäre zwar sofort gelöst, wenn ich das E-Mail Feld zur Pflicht mache, aber das ist ja auch Sinn der Sache. Das Formular soll ja auch für Nutzer sein, die keine Mail Adresse haben oder angeben möchten.

Jan 28.04.2006 17:53

Hi!

Tausche diesen Blcok:

Code:

if(mail($to_email,$_POST
['betreff'],$comment,$headers))
{

@mail($from_email,$_POST
['betreff'],$comment2,$headers);
header("LOCATION: $mail_success");
}

gegen diesen:

Code:

$check_send=mail($to_email,$_POST['betreff'],$comment,$headers);

if($check_send==true)  {

 if($from_email!='') @mail($from_email,$_POST['betreff'],$comment2,$headers);

 header("LOCATION: $mail_success");
}

Gruß
Jan

SPMan 28.04.2006 18:00

Zitat:

Zitat von Jan

Tausche diesen Block:

Code:

$check_send=mail($to_email,$_POST['betreff'],$comment,$headers);

if($check_send==true)  {

 if($from_email!='') @mail($from_email,$_POST['betreff'],$comment2,$headers);

 header("LOCATION: $mail_success");
}


Hallo Jan,
danke für die schnelle Hilfe. Leider besteht das Problem weiterhin. :cry:

VG
SPMan

Jan 28.04.2006 19:34

Hi!

Na dann, stimmt hier noch etwas nicht.

Tausche das:

Code:

$from_name="{$_POST['vorname']} {$_POST
['name']}";
$from_email=$_POST['email'];

gegen das:

Code:


$from_name="{$_POST['vorname']} {$_POST
['name']}";
$from_email=($_POST['email']!='') ? $_POST['email'] : $to_email;

Jetzt sollte es klappen.

Gruß
Jan

SPMan 28.04.2006 19:53

Hallo Jan,
jetzt hat es geklappt.
Vielen Dank! :)

Könntest Du mir evtl., falls Du Zeit und Lust hast, erklären was Du von dem was der Provider vorgeschlagen hast umgesetzt hast? Also auch, was Deine Änderungen bewirken. Ich möchte ja - wenn es geht - auch daraus lernen.

VG
SPMan

Jan 28.04.2006 20:04

Hi!

Kein Problem!

Das Problem ist ja, das der Provider keine Mails versendet ohne Absenderadresse bzw. wenn eine Zieladresse fehlt.

Die erste Korrektur bewirkt, dass keine E-Mail zurück an den Besucher geschickt wird, wenn auch keine Adresse vorhanden ist. Dazu habe ich eine IF-Bedinung aufgestellt, die die Variable $from_email prüft.

Die zweite Korrektur war nötig, da im Header der E-Mail die Absenderadresse mitgeschickt wird. Diese Lösung ist eine kurz geschriebene IF-Bedinung. Wenn diese nicht gesetzt ist, wird die Adresse des Seiteninhabers verwendet, damit eine Mail ohne Probleme verschickt werden kann.

Verstanden?

Gruß
Jan

SPMan 28.04.2006 20:19

Zitat:

Zitat von Jan
Das Problem ist ja, das der Provider keine Mails versendet ohne Absenderadresse bzw. wenn eine Zieladresse fehlt.

Ist ja an sich auch logisch. Mit Deiner Korrektur sollte das Script also auch zukünftig benutzbar sein.
Wird mit einer solchen "Einstellung" vom Provider den E-Mailinjection-Angriffen vorgebeugt?

Zitat:

Zitat von Jan
Die erste Korrektur bewirkt, dass keine E-Mail zurück an den Besucher geschickt wird, wenn auch keine Adresse vorhanden ist. Dazu habe ich eine IF-Bedinung aufgestellt, die die Variable $from_email prüft.

Ist hiermit die "Plausibilitäts-Prüfung" gemeint, die der Provider angesprochen hat?

Zitat:

Zitat von Provider
In einem weiteren Schritt sollten sie Plausibilitäts-Prüfungen aller im E-Mail-Header verwendeten Variblen (name, vorname etc.) implementieren, um somit Einfalltore für E-Mailinjection-Angriffe zu schließen.

Zitat:

Zitat von Jan
Die zweite Korrektur war nötig, da im Header der E-Mail die Absenderadresse mitgeschickt wird. Diese Lösung ist eine kurz geschriebene IF-Bedinung. Wenn diese nicht gesetzt ist, wird die Adresse des Seiteninhabers verwendet, damit eine Mail ohne Probleme verschickt werden kann.

Ich nehme an, dass Du hiermit diesen Vorschlag
Zitat:

Zitat von Provider
Verwenden Sie beispielsweise als Absender, wenn der Besucher keine E-Mailadresse angibt, eine eigene wie z.B. no-reply@.....

vom Provider umgesetzt hast.

Zitat:

Verstanden?
Wenn oben genanntes stimmt, dann ja. :)
Ich werde mir trotzdem den Code nochmal genauer angucken um nachzuvollziehen was im einzelnen passiert.

Ist denn ansonsten der Code brauchbar, oder wäre noch etwas zu verbessern?

VG & danke für Alles
SPMan

SPMan 28.04.2006 20:31

Jetzt antworte ich mir schon selbst. ;)
Ich habe bei Tests bemerkt, dass wenn man jetzt keine Mailadresse eingibt einem selbst sowohl die für den Absender bestimmte Mail als auch die für den Adressaten bestimmte Mail (die es ja ohne Mail-Adresse vom Adressaten gar nicht gibt) zugeht. Verstanden? ;)
Wenn ja:
Es ist zwar nicht schlimm, aber kann man das auch mit z.B. einer if-Abfrage ändern?

Jan 28.04.2006 20:31

Hi!

Stimmt soweit alles. :)

Der Code sieht brauchbar aus. Man könnte hier und da vielleicht noch keine Sachen optimieren. Z.B. ist die Funktion eregi langsamer als preg_match, aber du wirst mit diesem Script ja nicht tausende von Mails versenden wollen...

Gruß
Jan

The Doc 28.04.2006 20:31

Plausibilitäts Prüfung ist noch was anderes, aber so wie ich dein Können einschätze nicht wirklich für dich realisierbar.
Denn: Was du tun musst ist Folgendes:
prüfe ob $from_email eine valide Email-Adresse ist
prüfe ob $_POST['betreff'] ein valider Betreff ist (weiß nicht genau, wo da die Regelungen liegen, kann mir aber eine maximale Länge vorstellen)
prüfe ob ...

also jeden Parameter überprüfen, den du an mail() übergibst.
Das ganze macht man mittels sog. regulärer Ausdrücke, unter http://regexlib.com/ findest du vlt. schon welche, die du "out of the box" benutzen kannst.

Viel Glück!


Alle Zeitangaben in WEZ +2. Es ist jetzt 07:56 Uhr.

Powered by vBulletin® Version 3.8.11 (Deutsch)
Copyright ©2000 - 2024, vBulletin Solutions, Inc.

© Dirk H. 2003 - 2023