Tom: php mailer und die Header

Beitrag lesen

Hello,

danke für die hilfe :)

noch eine letzte frage habe ich.
ich habe ja nur ein feld. der nutzer schreibt in dieses feld seine email und schickt es weg. ich möchte, dass die mails, die bei mir ankommen, als absender eben die reingeschriebenen emails haben. ist sowas möglich?

ich möchte nämlich direkt antworten können,ohne die adresse zu kopieren,die ja jetzt nur als nachricht kommt.

Das ist möglich, aber nicht ungefährlich.
Diese Angabe müsste in die Header der eMail aufgenommen werden, also in die Verwaltungsinformationen, die auch der Mail-Server sich anschaut und auswertet.

Daher müssen diese Informationen besonders sorgsam geprüft werden und man muss darauf achten, dass einem niemand Dinge hineinschreibt, die nicht dorthin gehören. Es wäre einem Angreifer dadurch möglich, den ganzen Header umzuschrweiben und über Deinen Server an tausende Leute Spam zu verschicken. Das nennt sich dann "Mail-Injection"

Man muss also dafür sorgen, dass dort keine Sicherheitslücke bleibt.

Wie man das machen kann, wurde hier immer wieder diskutiert und ist im Archiv sicherlich hundertfach zu finden.

Du brauchset also nur ein zusätzliches Input-Feld

<input type="text" class="mailform" size="50" name="data[email]" />

und eine Überprüfungsmethode auf dem Server.

Meine Methode dafür ist:

$_POST['data']['email']   kommt am Client an.

Ich schaue nach, ob _genau__ein_ '@' im String enthalten ist.
  http://de.php.net/manual/de/function.substr-count.php

if (substr_count($_POST['data']['email']),'@') != 1)  return 'Bitte genau ein '@'pro eMail-Adresse angeben!';

ich schaue nach, ob der Datenwert ein CRLF (oder ähnlich) enthält.
  http://de.php.net/manual/de/function.strpos.php

if (strpos($_POST['data']['email'],CRLF) !== false) return 'Fehler im eMail-Feld';
  if (strpos($_POST['data']['email'],CR) !== false) return 'Fehler im eMail-Feld';
  if (strpos($_POST['data']['email'],LF) !== false) return 'Fehler im eMail-Feld';

Das gweht natürlich auch in einem Schritt mit einer Regular Expression.

Wenn diese Fehlermöglichkeiten ausgeschossen sind, ist die angegebene Absenderadresse
  für den Mail-Header unschädlich und meistens auch verwendbar.

Als Funktion sieht das dann so aus

#-------------------------

define ('CRLF', chr(13).chr(10));     ## Carriage Return für DOSen, HTTP und MAIL
define ('CR', chr(13));               ## Für ältere MACs
define ('CR', chr(10));               ## Für UNIXe und LINUXe

function check_mail($email)
{
   if (gettype($mail) != 'string') return 'Fehler im eMail-Feld';
   if (substr_count($mail,'@') != 1)  return "Bitte genau ein '@'pro eMail-Adresse angeben!";
   if (strpos($mail,CRLF) !== false) return 'Fehler im eMail-Feld';
   if (strpos($mail,CR) !== false) return 'Fehler im eMail-Feld';
   if (strpos($mail,LF) !== false) return 'Fehler im eMail-Feld';

return 0;
}

#--------------------------

Und im Programm dann.

$_error = array();        ### Array für die Fehlermeldungen meines Affenformulares
$_mailheader = array();   ### Array zum sammeln der zusätzlichen Header

if(($mailerror = check_mail($_POST['data']['email'])) !== 0)
  {
    $_error[] = $mailerror;
  }
  else
  {
    $_mailheader['From'] = $_POST['data']['email'];
  }

Später werden dann die Header zusammengebaut

$mailheaderstr = '';

foreach($_mailheader as $name => $val)
  {
    $mailheaderstr .= "$name: $val".CRLF;
  }

und den kannst Du dann in die mail()-Funktion von PHP einbauen

$mailsendOK = mail($mailto, $mailsubject, $mailmessage, $headerstr);

Solange sich aber im Array $_error Fehlermeldungen gesammlet haben, sende ich die mail gar nicht ab, sondern lege dem Client das Formular mitsamt den Fehlermeldungen und den falsxhen Daten wieder vor:

Es sollte nicht unerwähnt bleiben, dass Du ähnliche Prüfungen für $mailto und $mailsubject durchführen musst, wenn Du sie nicht fest vorgibst in Deinem Script.

Alles, was in $mailmessage zusammengefasst wird, ist allerdings (nach bsiherigen Erkenntnissen) unschädlich für den Mailserver. Ob es der Client (oser sein Leser *g*) vertragen kann, steht auf einem anderen Blatt.

Harzliche Grüße vom Berg
http://bergpost.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau
Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)