mail()/iamp_mail() übermitteln keinen Absender
trunx
- php
Hallo Forum,
ich habe auf einer Seite die Möglichkeit angeboten, e-mails zu versenden und erstelle für diese folgenden header:
$headers = "MIME-Version: 1.0\r\nContent-type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable\r\n";
$headers .= "To: ".$_REQUEST['email']."\r\nFrom: ".$user."\r\n";
Leider bleibt die Information, von wem die Mail nun kam auch dort und erscheint in diversen Mailprogrammen wie z.B. in thunderbird nicht in der Spalte "von" - dies trifft im übrigen auch auf freemailer wie GMX oder Yahoo! zu. Die Absenderspalte bleibt einfach leer.
Wie kann man das ändern? Ist der Code falsch oder muss der Absender anders deklariert werden?
wäre wie immer für Hilfe dankbar
bye trunx
<?PHP
/* Empfänger */
$empfaenger = array('Damir<mail@selfphp.com>');
/* Empfänger CC */
$empfaengerCC = array('Damir CC<mail@selfphp.com>');
/* Empfänger BCC */
$empfaengerBCC = array('Damir BCC<mail@selfphp.com>');
/* Absender */
$absender = 'Administrator SELFPHP<selfphp@selfphp.com>';
/* Rueckantwort */
$reply = 'Administrator SELFPHP<selfphp@selfphp.com>';
/* Betreff */
$subject = 'Info Mail von SELFPHP';
/* Nachricht */
$message = '<html>
<head>
<title>SELFPHP - Mail Beispiel</title>
</head>
<body>
<table width="214" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="47">PHP5</td>
<td width="56"> </td>
<td width="99"> </td>
</tr>
<tr>
<td> </td>
<td>SELFPHP</td>
<td> </td>
</tr>
<tr>
<td> </td>
<td> </td>
<td>www.selfphp.de</td>
</tr>
</table>
</body>
</html>
';
/* Baut Header der Mail zusammen */
$headers .= 'From:' . $absender . "\n";
$headers .= 'Reply-To:' . $reply . "\n";
$headers .= 'X-Mailer: PHP/' . phpversion() . "\n";
$headers .= 'X-Sender-IP: ' . $REMOTE_ADDR . "\n";
$headers .= "Content-type: text/html\n";
// Extrahiere Emailadressen
$empfaengerString = implode(',', $empfaenger);
$empfaengerCCString = implode(',', $empfaengerCC);
$empfaengerBCCString = implode(',', $empfaengerBCC);
$headers .= 'Cc: ' . $empfaengerCCString . "\n";
$headers .= 'Bcc: ' . $empfaengerBCCString . "\n";
/* Verschicken der Mail */
mail($empfaengerString, $subject, $message, $headers);
?>
vielen Dank für deine Antwort,
leider hilft sie mir erst mal nicht bei meinem Problem...den einzigen Unterschied im code, den ich auf Anhieb gesehen hab, war mein "\r" im header - dessen Entfernen brachte keine Besserung.
vllt sollte ich noch sagen, dass die mail-Funktion selbst funktioniert - wie gewünscht werden sowohl an den Empfänger, als auch an den Absender die entsprechenden Mails versandt, auch die Codierung funktioniert, sprich man erkennt am anderen Ende auch Umlaute usw. Komisch ist allerdings, dass der header selbst Bestandteil des Mail-bodys ist...hmm
bye trunx
so, ich habe nun den Code soweit bringen können, dass der header da bleibt, wo er hin soll und dass auch eine Absenderangabe erscheint...allerdings ist es die des mailservers meines Providers und keineswegs die, die ich im header angegeben habe...wie kommt das nun wieder?
bye trunx
so, ich habe nun den Code soweit bringen können, dass der header da bleibt, wo er hin soll und dass auch eine Absenderangabe erscheint...allerdings ist es die des mailservers meines Providers und keineswegs die, die ich im header angegeben habe...wie kommt das nun wieder?
bye trunx
auch das Problem hab ich nun gelöst, hmm keine Ahnung wie - egal, jetzt funktioniert es und ich kann mir in Ruhe diese injection-Geschichte und die Sache mit dem Spam ansehen...
gute Nacht
Moin!
ich habe auf einer Seite die Möglichkeit angeboten, e-mails zu versenden und erstelle für diese folgenden header:
$headers = "MIME-Version: 1.0\r\nContent-type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable\r\n";
$headers .= "To: ".$_REQUEST['email']."\r\nFrom: ".$user."\r\n";
Üble Sache: Du eröffnest den Benutzern Tür und Tor für Headerinjection, und damit für Spamming! Du mußt sämtliche Werte, die du in die Header schreibst, unbedingt auf bösen Inhalt prüfen und kontextgerecht escapen.
Dies trifft vor allem auf $\_REQUEST zu. Der Inhalt dieser Variablen ist von einem Angreifer beliebig manipulierbar, dort kann man auch zusätzliche Mailheader samt komplett eigenem Mailinhalt hinzufügen, wenn man nur passend (sprich: SMTP-konform) "\r\n" und weitere Inhalte einfügt.
Weiterhin: Die Verwendung von $\_REQUEST ist sowieso extrem ungünstig! Der Inhalt dieser Variablen setzt sich zusammen aus den Inhalten von $\_GET, $\_POST - und $\_COOKIES! Gerade diesen letzten Aspekt vergißt man gern, obwohl der Inhalt aus $\_COOKIES alle anderen Werte überschreibt. Cookies sind jedoch deutlich einfacher zu setzen und wirken ausgedehnter, als es angenommen wird, nämlich auch Cross Domain. Mindestbedingung ist, dass im Domainnamen zwei Punkte enthalten sind, aber dummerweise gibt es Länderdomains, die schon für sich allein diese Bedingung erfüllen, beispielsweise ".co.uk". Man könnte also auf einer beliebigen Domain versuchen, ein Cookie für "\*.co.uk" zu setzen, welches - [wenn der Browser keine Spezialprüfung anwendet](http://www.westpoint.ltd.uk/advisories/wp-04-0001.txt), wird er das gesetzte Cookie an alle anderen Domains zurücksenden, und dein Mailcode würde nicht an die Mailadresse im Formular gehen, sondern an die Mailadresse im Cookie.
Nutze immer $\_GET oder $\_POST für den Zugriff auf Formulardaten!
Zu guter Letzt das kontextabhängige Escapen: Wenn in den Variablen $\_REQUEST['email'] und $user Zeichen vorkommen, die laut SMTP-Standard dort nicht direkt "nackt" vorkommen dürfen (das beste Beispiel wären Zeilenumbrüche), erzeugst du eine ungültige Mail. Eventuell rettet der benutzte Mailserver deinen Arsch, indem er korrigierend eingreift - aber drauf verlassen darf man sich nicht.
Böse Zeichen in Mailheadern sind übrigens alle, die nicht in 7Bit-ASCII vorliegen!
> Leider bleibt die Information, von wem die Mail nun kam auch dort und erscheint in diversen Mailprogrammen wie z.B. in thunderbird nicht in der Spalte "von" - dies trifft im übrigen auch auf freemailer wie GMX oder Yahoo! zu. Die Absenderspalte bleibt einfach leer.
Der Befehl mail() hat extra einen Parameter, um den Empfänger zu übergeben. Nutze ihn! Ich kann mir gut vorstellen, dass darin dein Problem begründet liegt. Damit entfiele das Hinzufügen des TO-Mailheaders - aber natürlich nicht die strenge Prüfung der übergebenen Daten vom Formular.
- Sven Rautenberg
Hallo,
vielen Dank auch dir für deine Antwort - hmm da steckt ne Menge mehr drin als ich gefragt hab :D - muss ich mir in Ruhe ansehen, das mit $_REQUEST und dem $_COOKIES habe ich nicht gewußt...und das mit dem Spam habe ich mir auch schon gedacht, daher dürfen nur eingeloggte Nutzer mails versenden, aber vllt reicht das nicht aus, muss ich mal überprüfen, aber trotzdem vielen Dank! Ich glaube nicht, dass das Problem an der Empfänger-Variablen liegt, die ich auch nutze, u.z. zur Übermittlung der e-mail an den user selbst.
bye trunx
Moin!
....
- Sven Rautenberg
zum Thema header-Injection habe ich hier eine ganz gute Seite gefunden:
http://www.nyphp.org/phundamentals/email_header_injection.php
....
trunx