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