هنگام پردازش فرم های پی اچ پی، امنیت را در نظر بگیرید! در ادامه نشان می دهیم چگونه اسکریپت های پی اچ پی تان را با در نظر گرفتن امنیت بنویسید. اعتبار مناسب اطلاعات فرم برای حفاظت از فرم و اطلاعات شما از هکرها و اسپم ها مهم است!
فرم HTML ما در این آموزش کار خواهد کرد، شامل فیلدهایمختلفی برای انواع ورودیهای اجباری و اختیاری، دکمه های رادیویی و دکمه ارسال و … است.
قوانین اعتبارسنجی برای فرم بالا به شرح زیر است:
نام : مورد نیاز + فقط باید حاوی حروف و فضای خالی باشد.
ایمیل: مورد نیاز + باید یک آدرس ایمیل معتبر (با @ و.) داشته باشد.
وب سایت: اختیاری در صورت وجود، باید URL معتبر داشته باشد.
نظر: اختیاری فیلد ورودی چند خط (textarea).
جنسيت: مورد نياز باید یکی را انتخاب کنید.
کد HTML ساخت فرم
ابتدا به کد HTML ساده برای فرم نگاه کنیم:
فیلدهای متنی
نام، ایمیل، و زمینه های وب سایت، عناصر ورودی متن هستند، و فیلد نظر یک ناحیه متنی یا textarea است. کد HTML آنها بصورت زیر است:
Name: <input type="text" name="name">
E-mail: <input type="text" name="email">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="40"></textarea>
دکمه های رادیویی
فیلدهای جنسیت دکمه های رادیویی هستند و کد HTML آنها به صورت زیر است:
Gender:
<input type="radio" name="gender" value="female">Female
<input type="radio" name="gender" value="male">Male
<input type="radio" name="gender" value="other">Other
عنصر فرم
کد HTML این فرم به صورت زیر است:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
وقتی فرم ارسال می شود، داده های فرم با روش post ارسال می شوند.
متغیر $ _SERVER [“PHP_SELF”] چیست؟
$ _SERVER [“PHP_SELF”] یک متغیر سراسری است که نام فایل اسکریپت فعلی را دارد.
بنابراین، $ _SERVER [“PHP_SELF”] داده های فرم ارسال شده به خود همان صفحه ارسال می کند. به این ترتیب، کاربر پیغام خطا را در همان صفحه به عنوان فرم دریافت خواهد کرد.
عملکرد htmlspecialchars () چیست؟
تابع htmlspecialchars کاراکترهای خاصی را به اجزای HTML تبدیل می کند. این بدان معنی است که کاراکترهای HTML مانند <و> با & lt؛ و & gt؛ این مانع از حمله به استفاده از کد با تزریق کد HTML یا جاوا اسکریپت (حملات اسکریپت Cross-site) در قالب ها می باشد.
نکته مهم در امنیت فرم های پی اچ پی
متغیر $ _SERVER [“PHP_SELF”] می تواند توسط هکرها مورد استفاده قرار گیرد!
اگر PHP_SELF در صفحه شما استفاده شود، کاربر می تواند یک اسلش (/) و سپس بعضی از دستورات Scripting Cross Site (XSS) را اجرا کند.
اسکریپت cross-site (XSS) یک نوع آسیب پذیری امنیتی رایانه است که معمولا در برنامه های وب یافت می شود. XSS مهاجمین را قادر می سازد اسکریپت سمت سرویس گیرنده را به صفحات وب که توسط سایر کاربران مشاهده می شود، تزریق کند.
فرض کنید فرم زیر را در یک صفحه با نام test_form.php داریم:
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>">
در حال حاضر، اگر یک کاربر URL معمولی را در نوار آدرس مانند “http://www.example.com/test_form.php” وارد کند، کد بالا به آن ترجمه می شود:
<form method="post" action="test_form.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>
این کد یک برچسب اسکریپت و یک دستور هشدار را اضافه می کند. و هنگامی که صفحه بارگذاری می شود، کد جاوا اسکریپت اجرا می شود (کاربر جعبه هشدار را مشاهده می کند). این فقط یک مثال ساده و بی ضرر است که چگونه متغیر PHP_SELF می تواند مورد سوء استفاده قرار گیرد.
بدانید که هر کد جاوا اسکریپت می تواند داخل تگ <script> اضافه شود! یک هکر می تواند کاربر را به یک فایل دیگر سرور هدایت کند و این فایل می تواند یک کد مخرب را داشته باشد که می تواند متغیرهای سراسری را تغییر دهد و یا فرم را به یک آدرس دیگر ارسال کند تا مثلاً داده های کاربر را ذخیره کند.
چگونه می توان با حملات $_SERVER[“PHP_SELF”] مقابله کرد؟
حملات $ _SERVER [“PHP_SELF”] می تواند با استفاده از تابع htmlspecialchars رفع شود.
کد فرم باید مانند این باشد:
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
تابع htmlspecialchars کاراکترهای خاصی را به عناصر HTML تبدیل می کند. در نتیجه اگر کاربر سعی در بهره برداری از متغیر PHP_SELF داشته باشد، خروجی زیر نتیجه می شود:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>">
اعتبار سنجی اطلاعات فرم ها با پی اچ پی
برای بررسی اعتبار اطلاعات دریافتی از فرم ها، اولین کاری که انجام خواهیم داد این است که تمام متغیرها را از تابع htmlspecialchars پی اچ پی عبور دهیم.
وقتی از تابع htmlspecialchars استفاده میکنیم؛ اگر یک کاربر سعی در ارسال زیر در یک فیلد متنی داشته باشد:
<script> location.href ('http://www.hacked.com') </ script>
این ورودی بصورت زیر تبدیل خواهد شد :
& lt؛ script & gt؛ location.href ('http://www.hacked.com') & lt؛ / script & gt؛
که یک کد اکنون امن است که می تواند در یک صفحه یا درون ایمیل نمایش داده شود.
وقتی کاربر فرم را ارائه می دهد، لازم است دو کار دیگر نیز انجام دهیم:
- فواصل غیر ضروری را با کمک تابع trime برش بزنیم.
- کاراکترهای بک اسلش / را با کمک تابع stripslashes از آن حذف کنیم.
گام بعدی نوشتن یک تابع است که همه بررسی ها را برای ما انجام می دهد (که بسیار راحت تر از نوشتن کد های تکراری مشابه است).
می توانیم این تابع را test_input نامگذاری کنیم. حالا ما می توانیم هر متغیر $ _POST را با تابع test_input بررسی کنیم و اسکریپت آن به صورت زیر باشد:
<?php
// define variables and set to empty values
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$name = test_input($_POST["name"]);
$email = test_input($_POST["email"]);
$website = test_input($_POST["website"]);
$comment = test_input($_POST["comment"]);
$gender = test_input($_POST["gender"]);
}
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
?>
توجه داشته باشید که در ابتدای اسکریپت، می توانیم بررسی می کنیم که آیا فرم با استفاده از متد post فرستاده شده یا خیر. اگر با post فرستاده شده است تایید شود. و گرنه،فرم خالی نمایش دهید.
با این حال، در مثال بالا، فرض شده که تمام فیلدهای ورودی اختیاری و اسکریپت حتی اگر کاربر هیچ داده ای وارد نکند،درست کار می کند .