Im PHP-E-Mail-Skript im vorherigen Abschnitt besteht eine Sicherheitslücke.
Schauen Sie sich zunächst den PHP-Code aus dem vorherigen Kapitel an:
<html><head><meta charset="utf-8"><title>Coder-Tutorial (codercto.com)</title></head><body><?phpif (isset($_REQUEST['email' ] )) { // Wenn der E-Mail-Parameter empfangen wird, senden Sie eine E-Mail. $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $_REQUEST['message'] ; mail("[email protected]", $subject, $message, "From:" . $email); echo "Mail erfolgreich gesendet";} else { // Wenn keine E-Mail vorhanden ist Parameter dann Formularecho anzeigen "<form method='post' action='mailform.php'> E-Mail: <input name='email' type='text'><br> Betreff: <input name='subject' type='text'><br> Nachricht:<br> <textarea name='message' rows='15' cols='40'> </textarea><br> <input type='submit'> </form >";}?></body></html>
Das Problem mit dem obigen Code besteht darin, dass nicht autorisierte Benutzer über das Eingabeformular Daten in den E-Mail-Header einfügen können.
Was passiert, wenn der Benutzer der E-Mail im Eingabefeld des Formulars den folgenden Text hinzufügt?
[email protected]%0ACc:[email protected]%0ABcc:[email protected],[email protected],[email protected],[email protected]%0ABTo:[email protected]
Wie üblich fügt die Funktion mail() den obigen Text in den E-Mail-Header ein, sodass der Header jetzt über die zusätzlichen Felder „Cc:“, „Bcc:“ und „An:“ verfügt. Wenn der Benutzer auf die Schaltfläche „Senden“ klickt, wird diese E-Mail an alle oben genannten Adressen gesendet!
Der beste Weg, E-Mail-Injection zu verhindern, ist die Validierung von Eingaben.
Der folgende Code ähnelt dem im vorherigen Kapitel, aber hier haben wir einen Eingabevalidator hinzugefügt, um das E-Mail-Feld im Formular zu erkennen:
<html><head><meta charset="utf-8"><title>Coder-Tutorial (codercto.com)</title></head><body><?phpfunction spamcheck($field){ // filter_var ( ) E-Mail filtern // FILTER_SANITIZE_EMAIL verwenden $field=filter_var($field, FILTER_SANITIZE_EMAIL); Use FILTER_VALIDATE_EMAIL if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; }}if (isset($_REQUEST['email'])){ // Wenn der E-Mail-Parameter empfangen wird, senden Sie die E-Mail // Bestimmen Sie, ob die E-Mail legal ist $mailcheck = spamcheck($_REQUEST['email']); ($mailcheck==FALSE) { echo "Illegal input"; } else { // E-Mail senden $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; message'] ; mail("[email protected]", "Subject: $subject", $message, "Von: $email" ); für die Verwendung unseres E-Mail-Formulars"; }}else{ // Wenn kein E-Mail-Parameter vorhanden ist, zeigen Sie das Formular an echo "<form method='post' action='mailform.php'> Email: <input name='email' type ='text '><br> Betreff: <input name='subject' type='text'><br> Nachricht:<br> <textarea name='message' rows='15' cols='40'> </textarea><br> <input type='submit'> </form>";}?></body></html>
Im obigen Code verwenden wir einen PHP-Filter, um die Eingabe zu validieren:
Der Filter FILTER_SANITIZE_EMAIL entfernt illegale E-Mail-Zeichen aus der Zeichenfolge
Der Filter FILTER_VALIDATE_EMAIL validiert den Wert einer E-Mail-Adresse
Weitere Informationen zu Filtern finden Sie in unserem PHP-Filter.