PHP Säker E-post

Det finns en sårbarhet i PHP e-postskriptet från föregående avsnitt.

PHP E-post注入

Först, titta på PHP-koden i föregående avsnitt:

<html>
<body>
<?php
om (isset($_REQUEST['email']))
//Om "email" är ifyllt, skicka e-post
  {
  //Skicka e-post
  $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
//Om "email" inte är ifyllt, visa formuläret
  {
  echo "<form method='post' action='mailform.php'>
  E-post: <input name='email' type='text' /><br />
  Ämne: <input name='subject' type='text' /><br />
  Meddelande:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>
</body>
</html>

Det som är problemet med ovanstående kod är att obehöriga användare kan lägga till data i e-posthuvudet genom att fylla i formuläret.

Om användaren lägger till dessa texter i formulärens textfält, vad händer då?

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 vanligt lägger mail() -funktionen texten ovan i e-posthuvudet, så nu har huvudet extra fält för Cc:, Bcc: och To:. När användaren klickar på submit-knappen skickas detta e-postmeddelande till alla adresser ovan!

PHP förhindra e-postinjektion

Det bästa sättet att förhindra e-postinjektion är att validera inmatningen.

Följande kod är liknande föregående avsnitt, men vi har nu lagt till inmatningsvalidering för formulärets e-postfält:

<html>
<body>
<?php
function spamcheck($field)
  {
  //filter_var() rengör e-post 
  
  $field=filter_var($field, FILTER_SANITIZE_EMAIL);
  //filter_var() validerar e-post
  
  om(filter_var($field, FILTER_VALIDATE_EMAIL))
    {
    return TRUE;
    }
  else
    {
    return FALSE;
    }
  }
om (isset($_REQUEST['email']))
  //om "e-post" är ifyllt, fortsätt
  //kontrollera om e-postadressen är ogiltig
  $mailcheck = spamcheck($_REQUEST['email']);
  om ($mailcheck==FALSE)
    {
    echo "Ogiltig inmatning";
    }
  else
    //skicka e-post
    $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-post: <input name='email' type='text' /><br />
  Ämne: <input name='subject' type='text' /><br />
  Meddelande:<br />
  <textarea name='message' rows='15' cols='40'>
  </textarea><br />
  <input type='submit' />
  </form>";
  }
?>
</body>
</html>

I ovanstående kod använde vi PHP-filter för att validera inmatningen:

  • FILTER_SANITIZE_EMAIL tar bort otillåtna tecken från e-poststrängen
  • FILTER_VALIDATE_EMAIL verifierar e-postadress

Du kan hitta mer information om PHP FilterLäs mer om filter i detta avsnitt.