PHP-Sichere E-Mail

In dem PHP-eMail-Skript im vorherigen Abschnitt gibt es eine Lücke.

PHP E-Mail-Injektion

Zunächst einmal, schauen Sie sich den PHP-Code im vorherigen Abschnitt an:

<html>
<body>
<?php
if (isset($_REQUEST['email']))
//Wenn "email" ausgefüllt ist, E-Mail senden
  {
  //E-Mail senden
  $email = $_REQUEST['email']; 
  $subject = $_REQUEST['subject'];
  $message = $_REQUEST['message'];
  mail("someone@example.com", "Betreff: $subject",
  $message, "Von: $email" );
  echo "Vielen Dank, dass Sie unser Mailformular verwenden";
  }
else
//Wenn "email" nicht ausgefüllt ist, das Formular anzeigen
  {
  echo "<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 folgenden Code ist, dass nicht berechtigte Benutzer Daten in den E-Mail-Kopf eingefügt können, indem sie das Formular ausfüllen.

Was passiert, wenn der Benutzer diesen Text in das Eingabefeld des Formulars einfügt?

someone@example.com%0ACc:person2@example.com
%0ABcc:person3@example.com,person3@example.com,
anotherperson4@example.com,person5@example.com
%0ABTo:person6@example.com

Wie gewohnt, platzt die mail() -Funktion den obigen Text in den E-Mail-Kopf, daher sind jetzt zusätzliche Cc:, Bcc: und To:-Felder im Kopf vorhanden. Wenn der Benutzer auf die Schaltfläche Submit klickt, wird diese E-Mail an alle angegebenen Adressen gesendet!

PHP zur Verhinderung von E-Mail-Injection

Der beste Weg, um E-Mail-Injection zu verhindern, ist die Validierung der Eingaben.

Die folgenden Codezeilen sind ähnlich wie im vorherigen Abschnitt, aber wir haben die Validierung der E-Mail-Adresse im Formular hinzugefügt:

<html>
<body>
<?php
function spamcheck($field)
  {
  //filter_var() sanitizes the e-mail 
  
  $field=filter_var($field, FILTER_SANITIZE_EMAIL);
  //filter_var() validates the e-mail
  
  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", "Betreff: $subject",
    $message, "Von: $email" );
    echo "Vielen Dank, dass Sie unser Mailformular verwenden";
    }
  }
else
  // Wenn "email" nicht ausgefüllt ist, wird das Formular angezeigt
  echo "<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>

Im obigen Code haben wir PHP Filter verwendet, um die Eingabe zu validieren:

  • FILTER_SANITIZE_EMAIL entfernt ungültige Zeichen aus der E-Mail
  • FILTER_VALIDATE_EMAIL überprüft die E-Mail-Adresse

Sie können in unserem PHP FilterIn diesem Abschnitt können Sie mehr über Filter lesen.