PHP Secure Email
PHP E-Mail
PHP Error
PHP E-Mail im vorherigen Abschnitt Es gibt eine Sicherheitslücke im Mail-Skript.
PHP-E-Mail-Injection
Schauen Sie sich zunächst den PHP-Code im vorherigen Abschnitt an:
<html> <body> <?php if (isset($_REQUEST['email'])) //if "email" is filled out, send email { //send email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("someone@example.com", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } else //if "email" is not filled out, display the form { echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text' /><br /> Subject: <input name='subject' type='text' /><br /> Message:<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 Daten übertragen kann über ein Eingabeformular in den E-Mail-Header eingefügt werden.
Was passiert, wenn der Benutzer diese Texte zum Eingabefeld im Formular hinzufügt?
someone@example.com Cc:person2@example.com
Bcc:person3@example.com,person3@example.com,
andereperson4@example.com,person5@example.com
BTo:person6@example.com
Wie üblich fügt die Funktion mail() den obigen Text in den E-Mail-Header ein, sodass der Header jetzt zusätzliche Felder „Cc:“, „Bcc:“ und „An:“ enthält. Wenn der Benutzer auf die Schaltfläche „Senden“ klickt, wird diese E-Mail an alle oben genannten Adressen gesendet!
PHP verhindert E-Mail-Injection
Der beste Weg, E-Mail-Injection zu verhindern, besteht darin, die Eingabe zu validieren.
Der folgende Code ähnelt dem vorherigen Abschnitt, wir haben jedoch einen Eingabevalidator hinzugefügt, um das E-Mail-Feld im Formular zu erkennen:
<html> <body> <?php function spamcheck($field) { //filter_var() sanitizes the e-mail //address using FILTER_SANITIZE_EMAIL $field=filter_var($field, FILTER_SANITIZE_EMAIL); //filter_var() validates the e-mail //address using FILTER_VALIDATE_EMAIL if(filter_var($field, FILTER_VALIDATE_EMAIL)) { return TRUE; } else { return FALSE; } } if (isset($_REQUEST['email'])) {//if "email" is filled out, proceed //check if the email address is invalid $mailcheck = spamcheck($_REQUEST['email']); if ($mailcheck==FALSE) { echo "Invalid input"; } else {//send email $email = $_REQUEST['email'] ; $subject = $_REQUEST['subject'] ; $message = $_REQUEST['message'] ; mail("someone@example.com", "Subject: $subject", $message, "From: $email" ); echo "Thank you for using our mail form"; } } else {//if "email" is not filled out, display the form echo "<form method='post' action='mailform.php'> Email: <input name='email' type='text' /><br /> Subject: <input name='subject' type='text' /><br /> Message:<br /> <textarea name='message' rows='15' cols='40'> </textarea><br /> <input type='submit' /> </form>"; } ?> </body> </html>
Im obigen Code verwenden wir PHP-Filterung So validieren Sie die Eingabe:
FILTER_SANITIZE_EMAIL Entfernen Sie unzulässige Zeichen der E-Mail aus der Zeichenfolge
FILTER_VALIDATE_EMAIL Validieren Sie die E-Mail-Adresse