اسفند ۳, ۱۳۹۷ Mostafa بدون دیدگاه

اگر دنبال برنامه نویس برای ساخت افزونه ،قالب،سایت،برنامه ویندوز،اپلیکیشین اندروید،ربات تلگرام و.... هستید ،سفارش برنامه نویسی را مطالعه نمایید.

توجه : درخواست افزونه ،قالب، اسکریپت و نرم افزار و ... و سوالات و مشکلات خود را در انجمن ارسال نمایید

امنیت ایمیل در PHP

در این درس میخواهیم بررسی کنیم که ایمیل نوشته شده اسپم هست یا یک کاربر واقعی است.

<html>
<body>
 
<?php
if (isset($_REQUEST['email']))
//if "email" is filled out, send email
  {
  //send 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>

مشکل کد بالا این است که کاربر میتواند در بخش Header  تابع ایمیل داده های غیر مجاز وارد نماید. تصور کنید که کاربر تعداد زیادی ایمیل  مانند زیر را در این بخش وارد نماید چه اتفاقی پیش می آید؟

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

 

هر آنچه که تابع ایمیل میخواهد برای کابر بفرستند در header ذخیره شده و برای تمام ایمیل های  فرستاده میشود و از نظر وب مستر دارای ایراد است و امنیت ایمیل در PHP و باعث ایجاد اختلال در برنامه میشود.

جلوگیری از حملات به ایمیل در PHP

برای جلوگیری این حملات اسکریپتی به ایمیل در PHP به معتبر بودن داده ها را بررسی میکنیم.

برای افزایش امنیت ایمیل در PHP به کد قبل دو تابع اضافه کردیم. یک تابع بررسی میکند و تعداد ایمیل ها اگر زیاد باشد آن ها را پاک میکند دیگری معتبر بودن ان را بررسی میکند. در صورتی که این شرایط برقرار نباشد به کاربر پیغام ایمیل معتبر را وارد نمایید را نشان میدهد در غیر این صورت اطلاعات ایمیل را ذخیره کرده و ایمیلی با پیغام نوشته شده در message به کاربر ارسال میشود.

  • تابع ( ) FILTER_SANITIZE_EMAIL: اگر بیش از یک ایمیل نوشته شده باشد، ایمیل ها را پاک میکند.
  • تابع ( ) FILTER_VALIDATE_EMAIL: معتبر بودن ایمیل ها را بررسی میکند.
<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", "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>

 

مدیریت خطا در PHP

به طور پیش فرض مدیریت خطا بسیار ساده است. پیام خطا دارای یک نام فایل، شماره ی خطی که در آن خطا رخ داده است و توضیحی درباره خطا به مرورگر برای کاربر فرستاده میشود.

هنگامی که اسکریپت یا یک برنامه جدید به وب اضافه میکنید، مدیریت خطا از مهمترین بخش ها به شمار میرود. اگر در مدیریت خطا دارای نقص باشید برنامه و اسکریپت هایی که نوشته اید بسیار ابتدایی به نظر آمده و حتی میتواند شبکه را در معرض خطر قرار دهد.

روش هایی برای مدیریت خطا در PHP  وجود دارد که روش های رایج آن به صورت زیر است:

  • تابع ساده ()die
  • خطا های معمول و فعال کننده های خطا
  • گزارش خطا

آسان ترین راه مدیریت خطا در PHP

ابتدایی ترین و ساده ترین راه برای مدیریت خطا در PHP استفاده از تابع ()die است. در مثال زیر میخواهیم یک فایل متنی را باز کنیم. در صورت نبودن فایل پیغام خطا به کاربر نشان میدهد.

<?php
$file=fopen("welcome.txt","r");
?>

 

با استفاده از تابع fopen فایل مورد نظر را باز کردیم، اگر تابع دارای خطا باشد خطا را به صورت زیر نشان میدهد:

Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:\webfolder\test.php on line 2

 

برای این که خطایی مطابق با خطای فوق را نداشته باشیم و مطمئن باشیم که ابتدا بررسی شده است که فایلی به این نام وجود داشته است یا خیر و در صورت پیدا نکردن فایل آن را نشان دهد کد زیر میتواند به ما کمک کند:

<?php
if(!file_exists("welcome.txt"))
  {
  die("File not found");
  }
else
  {
  $file=fopen("welcome.txt","r");
  }
?>

 

در ابتدای این کد گفته شده اگر فایل welcome.txt وجود نداشت تابع ()die پیام خطا را نشان میدهد، در غیر این صورت فایل را باز میکند. پیام خطایی که نشان میدهد دیگر همانند پیام خطای قبل طولانی نخواهد بود و تنها بیان میکند که فایلی یافت نشد.

File not found

این روش برای نمایش خطا های معمولی استفاده میشود، برای خطا های پیشرفته تر باید از دستورهای کامل تری استفاده شود.
در درس بعدی به توضیح روش های دیگر مدیریت خطا می پردازیم.


برچسب ها