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?

War es hilfreich?

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 is 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top