keyboard_return  چسبون مقالات آموزشی اعتبار سنجی فرم در PHP- قسمت اول
  1. اعتبار سنجی فرم در PHP- قسمت اول

اعتبار سنجی فرم در PHP

زمان پردازش فرم های PHP، به امنیت آن بیاندیشید... چسبون در این آموزش نحوه اعتبار سنجی فرم های PHP را برای شما آماده کرده است. اعتبار سنجی مناسب فرم ها به منظور جلوگیری از حمله هکرها و اسپمرها اهمیت زیادی دارد. با چسبون همراه باشید. اعتبار سنجی فرم در این آموزش ما از فیلدهای مختلفی استفاده کردیم فیلدهای متنی الزامی و اختیاری، Radio Button و یک دکمه Submit فیلد نام: الزامی بوده و همچنین فقط حروف و فاصله بعنوان مقدار مجاز شناخته می شود ایمیل: الزامی بوده و باید ساختار صحیح (به همراه علامت @ و .) را رعایت کند وب سایت: اختیاری بوده در صورت انتخاب باید ساختار صحیح ادرس اینترنتی را رعایت کند توضیحات: اختیاری است و می تواند چند خط توضیح باشد جنسیت: الزامی بوده و یکی از موارد باید انتخاب شود. خب قبل از هر چیز لازمه که فیلدهای بالا رو در html بسازید: فیلدهای متنی

Name: <input type="text" name="name">
Email: <input type="text" name="email">
Website: <input type="text" name="website">
Comments: <textarea rows="5" cols="20" name="comment"></textarea>

فیلد انتخاب جنسیت:

جنسیت: <input type="radio" name="gender" value="زن">زن
  <input type="radio" name="gender" value="مرد">مرد

و یک دکمه برای ثبت اطلاعات

<input type="submit" name="submit" value="Submit">

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

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">  

خب در این فرم از متد POST برای ارسال اطلاعات استفاده کردیم که از امنیت بالاتری نسبت به متد GET برخورداره.

متغیر SERVER["PHP_SELF"]_$ چیست؟

متغیر $_SERVER یکی از متغیر های عمومی از پیش تعریف شده PHP است و PHP_SELF هم نام فایل اسکریپت جاری را بر می گرداند. بنابر این زمانی که کاربر روی دکمه Submit کلیک می کند بجای اینکه داده ها به فایل دیگری برای پردازش ارسال شود درون همان صفحه پردازش می شود (کاربر خطاها را در همان صفحه می بیند و به صفحه دیگری ارجاع داده نمی شود)

تابع ()htmlspeciachars چیست؟

این تابع کاراکترهای خاص را به موجودیت های HTML تبدیل می کند. یعنی کاراکتر های > و < را به "&lt" و "&gt" تبدیل می کند. این کار جلوی هکر ها رو برای تزریق کدهای HTML و Javascript (حمله Cross-site Scripting) می گیرد. توجه کنید که متغیر $_SERVER["PHP_SELF"] می تواند توسط هکر ها بکار گرفته شود. اگر در صفحه از این متغیر استفاده کنیم هکر می تواند در نوار آدرس مرورگرش بعد از آدرس فایل، با اضافه کردن یک اسلش (/) دستورات XSS را برای اجرا وارد کند.

 XSS یا Cross-site scripting چیست؟ XSS یک نوع قابلیت آسیب پذیری امنیت کامپیوتر است که معمولاً در برنامه های کاربردی وب بکار می رود و به هکرها اجازه می دهد تا صفحات وب را از طریق تزریق اسکریپت سمت کلاینت هک کنند.

فرض کنید فرم زیر در فایل test.php قرار دارد

<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">

حالا اگر کاربر آدرس صفحه مورد نظر را در مرورگرش وارد کند به طور مثال: http://www.example.com/test.php آنوقت کد بالا بصورت زیر ترجمه خواهد شد:

<form method="post" action="test.php">

اما اگر کاربر در انتهای آدرس کد زیر را تزریق کند

http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E

کد بالا بصورت زیر ترجمه خواهد شد:

<form method="post" action="test_form.php/"><script>alert('hacked')</script>

این کد یک تگ اسکریپت به همراه دستور alert جهت نمایش یک پیغام به آدرس اضافه کرده است. پس از اجرای صفحه کاربر پیغام (hacked) را مشاهده می کند. هر چند این فقط یک مثال ساده است و نحوه سو استفاده از متغیر PHP_SELF را نشان می دهد. توجه داشته باشید که هکر می تواند هر کد جاوا سکریپتی را درون تگ اسکریپت قرار دهد و کاربر را به آدرس یک فایل دیگر ریدایرکت کند و اطلاعات کاربران شما را برای خود ذخیره کند.

نحوه مقابله با هک از طریق PHP_SELF

با استفاده از تابع ()htmlspecialchars می توانید جلوی هک شدن از این طریق را بگیرید. کافیه که قبل از متغیر SERVER_$ از تابع ()htmlspecialchars استفاده کنید مثل زیر:

<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">

خب حالا اگه مثل مثال قبلی هکر بخواهد اسکریپتی را بعد از نام فایل شما اضافه کند، اسکریپت وارد شده بصورت زیر ترجمه خواهد شد:

<form method="post" action="test_form.php/&quot;&gt;&lt;script&gt;alert('hacked')&lt;/script&gt;">

همانطور که می بینید کدهای > و < توسط تابع htmlspecialchars به "&lt" و "&gt" تبدیل شده است که مانع از اجرای اسکریپت ها بر روی سیستم کاربر می شود. اعتبار سنجی داده های فرم در PHP اولین کاری که انجام میدهیم این است که همه متغیر ها رو به تابع ()htmlspecialchars پاس دهیم. حالا اگر کاربر تلاش کند متنی مثل زیر را ارسال کند

<script>location.href('http://www.hacked.com')</script>

کد بالا اجرا نخواهد شد زیرا که کاراکترهای خاص به معادل موجودیت html تبدیل شده اند. تا اینجا در مورد امنیت فرم ها در PHP صحبت کردیم. الان فرم ساخته شده برای استفاده در یک صفحه وب یا در یک ایمیل آماده است. در ادامه ما با استفاده از دو تابع PHP داده های اضافی را حذف می کنیم: با استفاده از تابع ()trim کاراکترهای غیر ضروری مثل (فاصله های اضافی، tab و خطوط خالی) را حذف می کنیم با استفاده از تابع ()stripsplash بک اسلش (\) را حذف می کنیم با توجه به اینکه عملیات فوق بر روی همه کادرهای ورودی باید اعمال شود تابعی تعریف می کنیم تا این کار را انجام دهد. نام تابع را ()check_it می نامیم.

function check_it($daea){
	$data=trim($data);
	$data=stripslashes($data);
	$data=htmlspecialchars($data);
	return $data;
}

حالا مقادیر متغیر POST_$ را با استفاده از تابع check_it بررسی می کنیم و مطالب اضافی رو از ورودی حذف می کنیم.

$name = check_it($_POST["name"]);
  $email = check_it ($_POST["email"]);
  $website = check_it ($_POST["website"]);
  $comment = check_it ($_POST["comment"]);
  $gender = check_it ($_POST["gender"]);

خب کدهای ما تا اینجا چیزی مثل این شده:

<!DOCTYPE HTML>  
<html>
<head>
<title>چسبون- اعتبار سنجی فرم در PHP</title>
<link rel="stylesheet" type="text/css" href="style.css">
</head>
<body>  

<?php
// ست کردن مقدار تهی به همه متغیرها
$name = $email = $gender = $comment = $website = "";

// تعریف تابع جهت بررسی ورودی ها و حذف داده های اضافی و اسکریپتها
function check_it($data) {
  $data = trim($data);
  $data = stripslashes($data);
  $data = htmlspecialchars($data);
  return $data;
}
?>

<h2>اعتبار سنجی فرم در PHP</h2>
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">  
  نام: <input type="text" name="name">
  <br><br>
  ایمیل: <input type="text" name="email">
  <br><br>
  آدرس سایت: <input type="text" name="website">
  <br><br>
  توضیحات: <textarea name="comment" rows="5" cols="40"></textarea>
  <br><br>
  جنسیت:
  <input type="radio" checked="true" name="gender" value="زن">زن
  <input type="radio" name="gender" value="مرد">مرد
  <br><br>
  <input type="submit" name="submit" value="ثبت">  
</form>
<?php
// پردازش فرم تنها درصورتیکه فرم از متد POST استفاده کرده باشد
if ($_SERVER["REQUEST_METHOD"] == "POST") {
  $name = check_it($_POST["name"]);
  $email = check_it($_POST["email"]);
  $website = check_it($_POST["website"]);
  $comment = check_it($_POST["comment"]);
  $gender = check_it($_POST["gender"]);

echo "<h2>کاربر گرامی شما اطلاعات زیر را وارد نموده اید</h2>";
echo "نام: " . $name . "<br>";
echo "ایمیل: " . $email . "<br>";
echo "وب سایت: " . $website . "<br>";
echo "توضیحات: " . $comment . "<br>";
echo "جنسیت: " . $gender . "<br>";
}
?>
</body>
</html>

توجه داشته باشید در این مثال ما با استفاده از متغیر REQUEST_METHOD بررسی می کنیم که اگر نحوه ارسال داده های فرم POST باشد، اطلاعات فرم پردازش خواهد شد. HTML بصورت پیش فرض از متد GET استفاده می کند بنابر این وقتی کاربر برای اولین بار ادرس فایل test.php را به سرور می فرستد فرم مذکور پردازش نمی شود چرا که شرط REQUEST_METHOD == POST برقرار نیست اما بعد از تکمیل فرم توسط کاربر و کلیک بر روی دکمه ثبت اطلاعات فرم پردازش خواهد شد. تا اینجا ما فقط اطلاعات را از کاربر دریافت کردیم. همانطور که مشاهده می کنید در صورتیکه کاربر هیچ داده ای وارد نکند باز هم اسکریپت اجرا خواهد شد و پیغام مناسب را نمایش می دهد.

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

اعتبار سنجی فرم در PHP- قسمت اول - 4.2 از 5 بر اساس 150 رای

امتیاز کاربران

اعتبار سنجی فرم در PHP- قسمت اول
دیدگاه‌ها

دیدگاهی وجود ندارد

2024 © Copyright کليه حقوق مادی و معنوی براي چسبون محفوظ است و هرگونه کپی برداری پیگرد قانونی دارد.