Können Sie mir Ratschläge geben, wie ich die E-Mail-Injektion in PHP mail()
verhindern kann, ohne die ursprünglichen Nachrichtendaten zu verlieren? Z.B. Wenn ich dem Benutzer erlauben soll, \r\n
, To
, CC
usw. zu verwenden, möchte ich sie nicht komplett von der Nachricht entfernen - ich möchte sie trotzdem geliefert bekommen, aber ohne zusätzliche Header hinzuzufügen oder irgendwie zuzulassen Mail-Injektion passieren.
Die meisten Ratschläge im Internet schlagen vor, diese Daten vollständig zu entfernen - aber ich möchte das nicht tun.
Ich sende Klartext (nicht HTML) Nachrichten über PHP mail()
function.
Was würden Sie empfehlen?
Um gültige E-Mails für die Verwendung im Empfänger-E-Mail-Feld zu filtern, werfen Sie einen Blick auf filter_var()
:
Dies stellt sicher, dass Ihre Benutzer nur einzelne, gültige E-Mails liefern, die Sie dann an die mail()
-Funktion übergeben können. Soweit ich weiß, gibt es keine Möglichkeit, Kopfzeilen über den Nachrichtentext mithilfe der PHP mail()
-Funktion zu injizieren, so dass Daten keine spezielle Verarbeitung benötigen.
Aktualisierung:
Laut Dokumentation für mail()
, wenn es direkt mit einem SMTP-Server kommuniziert , müssen Sie die Vollstopps im Nachrichtentext verhindern:
Update # 2:
Offenbar ist es auch möglich, über das Subjekt zu injizieren, aber da es kein FILTER_VALIDATE_EMAIL_SUBJECT
gibt, müssen Sie die Filterung selbst durchführen:
Angenommen, Sie möchten die E-Mail-Adresse des Besuchers wie folgt in das optionale Header-Feld eingeben:
%Vor%Allerdings, wenn
$ visitorEmailAddress
enthält
"[email protected] \ n \ nBCC: [email protected]"
Sie haben sich selbst zu einem Spam-Host gemacht und die Tür für die Mail-Injektion geöffnet. 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. Selbst Anhänge sind konvertierter Klartext, und sie können Anhänge einfach durch Hinzufügen einer Mimetype-Inhaltszeile senden.
Wenn Ihre Formularüberprüfung für die Felder FROM und / oder TO OK ist, müssen Sie die Formularüberprüfung für den Hauptteil der E-Mail überprüfen. Ich würde die Zeichen '- =' und '= - ausziehen und verhindern, dass Benutzer HTML-Code eingeben, indem Sie strip_tags()
verwenden.
Tags und Links php email sendmail email-injection