PHP Secure Email

Mayroong isang bug sa PHP e-mail script sa nakaraang section.

PHP E-mail 注入

Unang-una, tingnan natin ang PHP code sa nakaraang section:

<html>
<body>
<?php
kung may isset($_REQUEST['email'])
//Kung ang "email" ay natupad, magpadala ng email
  {
  //Magpadala ng 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
//Kung ang "email" ay hindi natupad, ipakita ang 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>

Ang problema sa itaas na code ay ang hindi pinagawang gumagamit ay maaaring magdagdag ng data sa header ng email sa pamamagitan ng paggamit ng form.

Kung magdagdag ang gumagamit ng mga teksto sa input box ng form, ano ang mangyayari?

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

Kung paano, ang mail() function ay naglalagay ng teksto sa itaas ng header ng email, kaya ngayon mayroon pang karagdagang mga field na Cc:, Bcc:, at To:. Kapag inililipat ng user ang submit button, ang email na ito ay mailahat sa lahat ng mga address na ito!

PHP na nag-iwas sa E-mail Injection

Ang pinakamahusay na paraan upang maiwasan ang e-mail injection ay ang pagpapatunay ng input.

Ang mga sumusunod na code ay katulad ng nakaraang section, ngunit nadagdagan na namin ang programang pagpapatunay ng input ng email field sa form:

<html>
<body>
<?php
function spamcheck($field)
  {
  //filter_var() naglalinis ng e-mail 
  //address gamit FILTER_SANITIZE_EMAIL
  $field=filter_var($field FILTER_SANITIZE_EMAIL);
  //filter_var() nagpapatunay ng e-mail
  //address gamit FILTER_VALIDATE_EMAIL
  kung filter_var($field FILTER_VALIDATE_EMAIL))
    {
    return TRUE;
    }
  else
    {
    return FALSE;
    }
  }
kung may isset($_REQUEST['email'])
  //kung naipunan ang "email", magpatuloy
  //tiningnan kung ang email address ay hindi wasto
  $mailcheck = spamcheck($_REQUEST['email']);
  kung FALSE ang $mailcheck)
    {
    echo "Invalid input";
    }
  else
    //magpadala ng 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>

In the above code, we used PHP filters to validate the input:

  • FILTER_SANITIZE_EMAIL Removes Illegal Characters from Email String
  • FILTER_VALIDATE_EMAIL Validates Email Address

You can find more about our PHP FiltersRead more about filters in this section.