PHP Sikre Email

Der er en fejl i PHP e-mail-skriptet i det forrige afsnit.

PHP E-mail Indsættelse

Først, se på PHP-koden i det forrige afsnit:

<html>
<body>
<?php
if (isset($_REQUEST['email']))
//Hvis "email" er udfyldt, send e-mail
  {
  //Send e-mail
  $email = $_REQUEST['email'] ; 
  $subject = $_REQUEST['subject'] ;
  $message = $_REQUEST['message'] ;
  mail("someone@example.com", "Emne: $subject",
  $message, "Fra: $email" );
  echo "Tak fordi du bruger vores mailformular";
  }
else
//Hvis "email" ikke er udfyldt, vis formularen
  {
  echo "<form method='post' action='mailform.php'>
  E-mail: <input name='email' type='text' /><br />
  Emne: <input name='subject' type='text' /><br />
  Besked:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>
</body>
</html>

Problemet med ovenstående kode er, at uautoriserede brugere kan indsætte data i e-mailhovedet ved hjælp af inputformularen.

Hvis brugeren tilføjer disse tekster i inputfeltet på formularen, hvad vil der ske?

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

Som altid lægger mail() funktionen teksten ovenfor ind i e-mailens header, så nu har headeren ekstra felter som Cc:, Bcc: og To:. Når brugeren klikker på submit-knappen, sendes denne e-mail til alle adresserne!

PHP til at forhindre e-mail-injektion

Den bedste måde at forhindre e-mail-injektion er at validere input.

Denne kode ligner den forrige sektion, men vi har tilføjet en inputvalideringsproces for email-feltet i formularen:

<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", "Emne: $subject",
    $message, "Fra: $email" );
    echo "Tak fordi du bruger vores mailformular";
    }
  }
else
  //Hvis "email" ikke er udfyldt, vis formularen
  echo "<form method='post' action='mailform.php'>
  E-mail: <input name='email' type='text' /><br />
  Emne: <input name='subject' type='text' /><br />
  Besked:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>
</body>
</html>

I ovenstående kode brugte vi PHP filtre til at validere input:

  • FILTER_SANITIZE_EMAIL fjerner ulovlige tegn fra e-mail-adressen
  • FILTER_VALIDATE_EMAIL verificerer e-mail-adressen

Du kan finde flere oplysninger om vores PHP filtreLæs mere om filtre i dette afsnit.