Robert B.: php Mailer

Beitrag lesen

problematische Seite

Hi Jenny,

vorab: Ich empfehle den Mailer schnellstmöglich offline zu nehmen, weil er gravierende Sicherheitslücken enthält, mit denen du deine Seite zur Spamschleuder machst!

Du kannst übrigens Code auch schön formatieren.

<?php 

// Universaler Formularmailer GDW 2005
// Die Formulardaten werden mit action="gdwmailer.php" an diese Datei geschickt und ausgewertet
// In das Formular müssen am Anfang versteckte Formularfelder eingefuegt werden:
// <input type="hidden" name="subject" value="EVALUATION">
// <input type="hidden" name="return" value="http://mondfrau.eu/thankyou.html">
// <input type="hidden" name="empfaenger" value="info@mondfrau.eu">

Das ist keine gute Idee, denn dein Skript sieht nicht so aus, als würde es prüfen, von wo aus es aufgerufen wird. Das heißt, ich kann eine eigene Seite bauen, die dein Skript mit anderen „hidden“-Parametern aufruft und damit

  • eine Mail an andere Empfänger – empfaenger
  • mit einem anderen Betreff – subject – sendet
  • und anschließend auf eine beliebige Seite – return – weiterleitet.

Ich empfehle diese konstanten Werte in (d)einer PHP-Datei als Konstante definieren.

Dazu missachtet dein Skript den Kontextwechsel zwischen HTTP Post und Email, wodurch möglicherweise die mail-Funktion noch weiter exploitet werden kann, zum Beispiel durch mehrere Empfänger oder zusätzliche Header-Felder.

Hier werden die Werte aus $_POST lediglich umkopiert, aber nicht wie in der Dokumentation der mail-Funktion beschrieben maskiert:

$mailto=$_POST["empfaenger"];
$subject=$_POST["subject"];
if (isset($_POST["Email"]) && !empty($_POST["Email"])){
$mail=$_POST["Email"];
}
else{
$mail="Dein Formularmailer<Dein Formularmailer>";
}

Mit $_POST['Email'] = "Dein Formularmailer\r\nReply-To: evil@example.org" ist schon gleich ein zusätzlicher Header eingefügt worden:

$header="From: $mail";
// …

An dieser Stelle würde ich normalerweise eine Fehlermeldung erwarten:

mail($mailto, $subject, $mailtext, $header) or die ("Die Nachricht konnte leider nicht versendet werden!");

Du könntest mal das error reporting anpassen und schauen, warum mail false zurückgibt.

Nach dem die wird das jedenfalls nicht mehr ausgegeben, wobei $return auch nirgends gesetzt worden ist:

header("Location: $return");
?>

Auf das schließende ?> kannst du übrigens verzichten, falls danach nichts mehr kommt.

Viele Grüße
Robert