ایمیل امن در PHP

در کد PHP ایمیل در بخش قبلی، یک حفره وجود دارد.

تزریق ایمیل PHP

اول از همه، به کد PHP در بخش قبلی نگاه کنید:

<html>
<body>
<?php
اگر (isset($_REQUEST['email']))
//اگر "ایمیل" پر شده باشد، ایمیل ارسال شود
  {
  //ایمیل ارسال شود
  ایمیل = $_REQUEST['email']; 
  موضوع = $_REQUEST['subject'];
  پیام = $_REQUEST['message'];
  mail("someone@example.com", "Subject: $subject",
  $message, "From: $email" );
  echo "Thank you for using our mail form";
  }
else
//اگر "ایمیل" پر نشده باشد، فرم نمایش داده شود
  {
  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>

مشکل موجود در این کد این است که کاربران غیرمجاز می‌توانند با استفاده از فرم، داده‌ها را در سراسر ایمیل وارد کنند.

اگر کاربر این متن‌ها را در مربع ورودی فرم اضافه کند، چه اتفاقی خواهد افتاد؟

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

مانند همیشه، تابع mail() متن بالا را در سرایمیل قرار می‌دهد، بنابراین حالا سرایمیل شامل فیلدهای اضافی Cc:, Bcc: و To: است. هنگامی که کاربر دکمه ارسال را کلیک می‌کند، این ایمیل به تمامی آدرس‌های بالا ارسال می‌شود!

جلوگیری از تزریق ایمیل با PHP

بهترین روش برای جلوگیری از تزریق ایمیل، بررسی ورودی‌ها است.

این کد مشابه بخش قبلی است، اما ما برنامه‌ی بررسی ورودی فیلد ایمیل را اضافه کرده‌ایم:

<html>
<body>
<?php
دستور spamcheck($field)
  {
  // filter_var() ایمیل را پاکسازی می‌کند 
  // استفاده از FILTER_SANITIZE_EMAIL برای آدرس
  $field = filter_var($field, FILTER_SANITIZE_EMAIL);
  // filter_var() ایمیل را بررسی می‌کند
  // استفاده از FILTER_VALIDATE_EMAIL برای آدرس
  اگر (filter_var($field, FILTER_VALIDATE_EMAIL))
    {
    بازگردان TRUE;
    }
  else
    {
    بازگردان FALSE;
    }
  }
اگر (isset($_REQUEST['email']))
  {// اگر "ایمیل" پر شده باشد، ادامه دهید
  // بررسی آدرس ایمیل نامعتبر
  $mailcheck = spamcheck($_REQUEST['email']);
  اگر ($mailcheck==FALSE)
    {
    echo "ورودی نامعتبر";
    }
  else
    {// ارسال ایمیل
    ایمیل = $_REQUEST['email']; 
    موضوع = $_REQUEST['subject'];
    پیام = $_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 the email string
  • FILTER_VALIDATE_EMAIL Validates email address

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