2012-08-14 4 views
8

Konnten Sie mir beraten, wie ich gehe, email injection in PHP mail() zu verhindern, ohne ursprüngliche Nachrichtendaten zu verlieren? Z.B. Wenn ich dem Benutzer erlauben soll, \r\n, To, CC usw. zu verwenden, möchte ich sie nicht vollständig von der Nachricht entfernen - ich will sie immer noch geliefert, aber ohne zusätzliche Header hinzufügen oder irgendwie Mail-Injektion passieren zu lassen.Korrekte Verhinderung der Posteinspritzung in PHP

Die meisten Ratschläge im Internet schlagen vor, diese Daten vollständig zu entfernen - aber ich will das nicht tun.

Ich sende Klartext (nicht HTML) Nachrichten über PHP mail() Funktion.

Was würden Sie empfehlen?

+0

'To:' und 'CC:' ist headers - Sie Funktionalität, indem sie nicht halten können. Ich bin mir nicht sicher, was du hier fragst. Geben Sie ein Muster Ihrer ersten Idee und wir werden versuchen, Sie in die richtige Richtung zu lenken :-). – Matt

+0

Wo verwenden Sie vom Benutzer bereitgestellte Daten? Nur im Nachrichtentext? – FtDRbwLXw6

+0

@drrcknlsn Die vom Benutzer bereitgestellten Daten befinden sich im Nachrichtentext und in der Empfänger-E-Mail. – Atm

Antwort

7

Um gültige E-Mails für die Verwendung in dem Empfänger E-Mail-Feld zu filtern, einen Blick auf filter_var() nehmen:

$email = filter_var($_POST['recipient_email'], FILTER_VALIDATE_EMAIL); 

if ($email === FALSE) { 
    echo 'Invalid email'; 
    exit(1); 
} 

Dies wird Ihre Benutzer liefern nur singulär, gültige E-Mails stellen Sie sicher, die Sie dann auf die mail() passieren kann Funktion. Soweit ich weiß, gibt es keine Möglichkeit, Kopfzeilen über den Nachrichtentext mit der Funktion PHP mail() zu injizieren, so dass Daten keine spezielle Verarbeitung benötigen.

Update:

Nach the documentation for mail(), wenn es direkt an einen SMTP-Server zu sprechen, müssen Sie Vollbremsungen im Nachrichtentext verhindern:

$body = str_replace("\n.", "\n..", $body); 

Update # 2:

Anscheinend ist es auch möglich, über das Thema zu injizieren, als auch, aber da gibt es keine FILTER_VALIDATE_EMAIL_SUBJECT, müssen Sie tun das Filtern von selbst:

$subject = str_ireplace(array("\r", "\n", '%0A', '%0D'), '', $_POST['subject']); 
+0

Danke, aber im Internet heißt es, dass es möglich ist, Header in den Nachrichtentext mit der Funktion mail() einzufügen. – Atm

+0

Vielen Dank für die Funktion filter_var. Ich benutze es anstelle des regulären Ausdrucks, den ich benutze. – Atm

+2

@Atern Hinweis filter_var hat einige Einschränkungen, was E-Mails erlaubt, weshalb ich immer noch Regex für die Validierung von E-Mails verwenden, verwende ich: http://www.dominysayers.com/isemail – Sammaye

3

Sie Angenommen, möchten Sie die E-Mail-Adresse des Besuchers im optionalen Header-Feld setzen, wie so:

$headers = "From: $visitorEmailAddress"; 

Wenn jedoch

$ visitorEmailAddress

enthält

"[email protected] \ n \ NBCC: [email protected]"

Sie sich einen Spam-Wirt gemacht haben, die Tür für Mail-Injektion zu öffnen. Dies ist ein sehr einfaches Beispiel, aber kreative Spammer und böswillige Hacker können potenziell schädliche Skripte in Ihren E-Mails schleichen, da E-Mails als reine Textdatei gesendet werden. Sogar Anhänge werden in Klartext konvertiert und sie können Anhänge einfach durch Hinzufügen einer Mimetype-Inhaltszeile senden.

Wenn Ihre Formularvalidierung für die Felder FROM und/oder TO OK ist, müssen Sie die Formularüberprüfung für den Text der E-Mail überprüfen.Ich würde die Zeichen "- =" und "= -" entfernen und verhindern, dass Benutzer HTML-Code eingeben, indem Sie strip_tags() verwenden.

0

eine bestimmte Mime E-Mail-Bibliothek verwenden, wie Mail_Mime:

<?php 
include 'Mail.php'; 
include 'Mail/mime.php' ; 

$mime = new Mail_mime(); 

$mime->setTXTBody("Message goes here"); 
$hdrs = $mime->headers(array(
    'From' => '[email protected]', 
    'Subject' => 'Test mime message' 
)); 
$body = $mime->get(); 

$mail = &Mail::factory('mail'); 
$mail->send('[email protected]', $hdrs, $body); 

?> 
Verwandte Themen