PHP Veilige E-mail

Er is een lek in het PHP e-mail script uit het vorige hoofdstuk.

PHP E-mail Injectie

Eerst en vooral, kijk naar het PHP-code voorbeeld in het vorige hoofdstuk:

<html>
<body>
<?php
if (isset($_REQUEST['email']))
//Als "email" is ingevuld, verstuur e-mail
  {
  //Verstuur e-mail
  $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
//Als "email" niet is ingevuld, toon het formulier
  {
  echo "<form method='post' action='mailform.php'>
  E-mail: <input name='email' type='text' /><br />
  Onderwerp: <input name='subject' type='text' /><br />
  Bericht:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>
</body>
</html>

Het probleem met de bovenstaande code is dat onbevoegde gebruikers gegevens kunnen injecteren in de e-mailkop door het invullen van het formulier.

Wanneer de gebruiker deze tekst invoert in het invoerveld van het formulier, wat zal er dan gebeuren?

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

Net als altijd, plaats de tekst in de e-mailkop met de mail() functie, dus nu zijn er extra Cc:, Bcc: en To: velden in de kop. Wanneer de gebruiker op de knop indient, wordt dit e-mail naar alle hierboven vermelde adressen verzonden!

PHP voorkomen van e-mailinjectie

De beste manier om e-mailinjectie te voorkomen, is door invoer te valideren.

Deze code is vergelijkbaar met het vorige deel, maar we hebben nu de invoervalidatie van het e-mailveld in het formulier toegevoegd:

<html>
<body>
<?php
function spamcheck($field)
  {
  //filter_var() schoonmaakt het e-mailadres 
  
  $field=filter_var($field, FILTER_SANITIZE_EMAIL);
  //filter_var() validatie van het e-mailadres
  
  if(filter_var($field, FILTER_VALIDATE_EMAIL))
    {
    return TRUE;
    }
  else
    {
    return FALSE;
    }
  }
if (isset($_REQUEST['email']))
  //als "e-mail" is ingevuld, ga verder
  //controleer of het e-mailadres ongeldig is
  $mailcheck = spamcheck($_REQUEST['email']);
  if ($mailcheck==FALSE)
    {
    echo "Ongeldige invoer";
    }
  else
    //verzend e-mail
    $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'>
  E-mail: <input name='email' type='text' /><br />
  Onderwerp: <input name='subject' type='text' /><br />
  Bericht:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>
</body>
</html>

In de bovenstaande code hebben we PHP filters gebruikt om de invoer te valideren:

  • FILTER_SANITIZE_EMAIL verwijdert ongeldige karakters uit de e-mail
  • FILTER_VALIDATE_EMAIL verifieert het e-mailadres

U kunt onze PHP filtersLees meer over filters in dit hoofdstuk.