Wie vor Mailing-Benutzereingaben in PHP zu sanieren?
Frage
Ich habe einen einfachen PHP-Mailer-Skript, das Wert aus einem Formular über POST und Mails sie mich vorgelegt nimmt:
<?php
$to = "me@example.com";
$name = $_POST['name'];
$message = $_POST['message'];
$email = $_POST['email'];
$body = "Person $name submitted a message: $message";
$subject = "A message has been submitted";
$headers = 'From: ' . $email;
mail($to, $subject, $body, $headers);
header("Location: http://example.com/thanks");
?>
Wie kann ich sterilisieren Sie die Eingabe?
Lösung
Desinfizieren der post-Variable mit filter_var()
.
Beispiel hier . Wie:
echo filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
Andere Tipps
Da Sie nicht eine SQL-Abfrage oder irgendetwas hier bauen, die einzig relevante Validierung, die ich für diese Eingänge sehen kann, ist eine E-Mail-Validierung für $ _POST [ „Email“], und vielleicht einen alphanumerischer Filter auf den anderen Feldern, wenn Sie wirklich wollen, den Umfang dessen, was die Nachricht enthalten kann, begrenzen.
die E-Mail-Adresse zu filtern, verwenden Sie einfach filter_var :
$email = filter_var($email, FILTER_SANITIZE_EMAIL);
Wie pro Frank Farmer Vorschlag, Sie können auch neue Zeilen in der E-Mail Thema filtern:
$subject = str_replace(array("\r","\n"),array(" "," "),$subject);
Wie andere haben darauf hingewiesen, filter_var
groß ist. Wenn es nicht vorhanden ist, fügen Sie diese zu Ihrem Werkzeugkasten.
Die $headers
Variable ist besonders schlechte Sicherheitsweisen. Es kann angehängt werden und Ursache Spoofing-Header hinzugefügt werden. Dieser Beitrag genannt Email Injection es ziemlich gut behandelt.
filter_var i
s groß, aber ein anderer Weg, um sicherzustellen, dass etwas eine E-Mail-Adresse ist und nicht etwas Schlechtes ist eine isMail()
Funktion zu verwenden. Ist hier ein:
function isEmail($email) {
return preg_match('|^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]{2,})+$|i', $email);
};
So, diese zu verwenden, könnten Sie tun:
if (isset($_POST['email']) && isEmail($_POST['email'])) {
$email = $_POST['email'] ;
} else {
// you could halt execution here, set $email to a default email address
// display an error, redirect, or some combination here,
}
Im Hinblick auf die manuelle Validierung, die Begrenzung der Länge mit substr()
, laufen strip_tags()
und sonst zu begrenzen, was in gesetzt werden kann.
Sie müssen alle Zeilenumbrüche von der Eingabe von Nutzern in $ Header zur Verfügung gestellt entfernen, die () ($ E-Mail in Ihrem Fall) auf der Post übergeben wird! Siehe Email Injektion .
PHP sollte $ an und $ Thema desinfizierenden kümmern, aber es gibt Versionen von PHP mit Bugs (Betroffen sind PHP 4 <= 4.4.6 und PHP 5 <= 5.2.1 finden Sie unter MOPB-34-2007 ).
Sie können den Code aus artlung
Antwort verwenden oben E-Mail zu bestätigen ..
Ich benutze diese Art von Code-Header Injektion zu verhindern ..
// define some mail() header's parts and commonly used spam code to filter using preg_match
$match = "/(from\:|to\:|bcc\:|cc\:|content\-type\:|mime\-version\:|subject\:|x\-mailer\:|reply\-to\:|\%0a|\%0b)/i";
// check if any field's value containing the one or more of the code above
if (preg_match($match, $name) || preg_match( $match, $message) || preg_match( $match, $email)) {
// I use ajax, so I call the string below and send it to js file to check whether the email is failed to send or not
echo "failed";
// If you are not using ajax, then you can redirect it with php header function i.e: header("Location: http://example.com/anypage/");
// stop the script before it reach or executing the mail function
die();
}
Die Header-Filterung über die mail()
ist zu streng, da einige Nutzer ohne Absicht der gefilterten Strings in ihrer Nachricht möglicherweise verwenden Ihr E-Mail-Formular kapern, so umleiten zu einer Seite, ist zu erklären, welche Art von Zeichenfolge, die nicht erlaubt ist in Form oder erklären, es auf dem Formular-Seite.