با عرض سلام و وقت به خیر خدمت کاربران سایت پی وی لرن و کاربرانی که دوره ی آموزش php 7 را دنبال می کنند.
در جلسه گذشته فصل Forms ها را با معرفی و آشنایی با فرم ها آغاز کردیم. در این جلسه و در ادامه این دوره به ارزیابی اعتبار فرم ها در php 7 می پردازیم.
در این جلسه و جلسات بعدی روش استفاده از اسکریپت PHP برای ارزیابی اعتبار داده های فرم را بررسی خواهیم کرد.
در زمان بپردازش فرم های PHP به فکر امنیت (SECURITY) باشید :
این صفحه حاوی اعتباربخشی فرم نیست، فقط طریقه ارسال و دریافت داده ها نمایش داده شد.
هرچند در صفحه بعد طریقه پردازش فرم های PHP با در نظر گرفتن امنیت برنامه بحث می شود.
اعتباربخشی دقیق و صحیح داده های فرم برای محافظت خود در مقابل هکرها و اسپمرها ضروری است.
در ادامه یک فرم HTML ایجاد می کنیم که از فیلدهای مختلفی نظیر: فیلدهای الزامی و اختیاری، فیلدهای متنی، دکمه های رادیویی، دکمه سابمیت و غیره تشکیل شده است.
خروجی این فرم را در ادامه مشاهده خواهید کرد.
در ادامه ارزیابی اعتبار فرم ها در php 7 ، می توانید قوانین تعیین اعتبار فرم را ببینید.
فیلد | قاعده اعتباربخشی |
---|---|
نام | الزامی + فقط حاوی حروف و فاصله باشد |
ایمیل | الزامی + بایستی آدرس ایمیل معتبر حاوی @ و . باشد |
وبسایت | اختیاری، اگر تکمیل شد، حاوی یک URL صحیح باشد |
نظر | اختیاری، فیلد متنی چند خطی (محدوده متنی) |
جنس | الرامی. بایستی یکی از دو مورد انتخاب شود. |
فیلدهای نام، ایمیل و وبسایت همگی ورودی متنی دارند و فیلد متنی هستند؛ فیلد نظر به صورت متن چند خطی است.
کد این فیلدها به صورت زیر خواهد بود :
1 2 3 4 | 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 آن به صورت زیر است :
1 2 3 4 | 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 فرم به صورت زیر است :
1 | <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> |
زمانی که فرم سابمیت (ارسال) می شود، داده های وارد شده در فرم با استفاده از متد POST ارسال می شوند.
متغیر [SERVER[“PHP_SELF_$ یک متغیر سوپرگلوبال است که نام فایل اسکریپت در حال اجرا را بر می گرداند.
بنابراین متغیر سوپرگلوبال [SERVER[“PHP_SELF_$ داده های ارسال شده از فرم را به خود صفحه بر می گرداند (جای اینکه به صفحه دیگری برود.)
بدین طریق، اگر همان صفحه فرم را نمایش دهد، کاربر پیغام خطا دریافت خواهد کرد.
تابع () htmlspecialchars چیست؟
تابع () htmlspecialchars حروف خاص را به entities های HTML تبدیل می کند.
به این معنا است که کاراکترهای HTML مانند <and > را با lt&؛ و gt& جایگذاری می شوند.
این کار از سوء استفاده هکرها و مزاحمان از فیلدهای فرم را در هنگام تزریق کد HTML یا جاوا اسکریپت به فرم (Cross-site Scripting attacks) کاهش می دهد.
متغیر [SERVER[“PHP_SELF”_$ ممکن است توسط هکرها استفاده شود.
اگر PHP_SELF در صفحه شما استفاده شده باشد، کاربر می تواند یک اسلش (/) را به همراه مقداری فرمان اسکریپت کراس سایت (xss) برای اجرا در فرم وارد کند.
کراس سایت اسکریپتینگ (xss) نوعی آسیب پذیری امنیتی کامپیوتری است که در برنامه های وب (وب اپلیکیشن) یافت می شود.
XSS به هکرها این امکان را می دهد که سمت کلاینت اسکریپت خود را به داخل صفحات وبی که توسط کاربران دیگر مشاهده می شود، تزریق کنند.
فرض کنید ما فرم زیر را در یک فایل به نام “test_form.php” در اختیار داریم.
1 | <form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>"> |
حالا، اگر کاربر یک URL معمولی را در آدرس بار مرورگر وارد کند.
مثل “http://www.example.com/test_form.php” ، کد فوق شکل زیر ترجمه می شود :
1 | <form method="post" action="test_form.php"> |
تاکنون همه چیز خوب است.
حالا در نظر بگیرید که یک کاربر در نوار آدرس به آدرس زیر وارد می شود :
1 | http://www.example.com/test_form.php/%22%3E%3Cscript%3Ealert('hacked')%3C/script%3E |
در این حالت، کد فوق به صورت زیر ترجمه می گردد :
1 | <form method="post" action="test_form.php/"><script>alert('hacked')</script> |
این کد یک تگ اسکریپت و یک فرمان اخطار را اضافه می کند.
هنگامی که صفحه بارگذاری می شود، کد جاوا اسکریپت اجرا می شود (کاربر یک پیغام هشدار دریافت می کند).
این تنها یک نمونه ساده و بی ضرر سوء استفاده از متغیر PHP_SELF است.
در جریان باشید که هر گونه کد جاوا اسکریپت را می توان بین دو تگ <اسکریپت> قرار داد!
یک هکر می تواند کاربر را از فایلی به فایل دیگر بر روی سرور دیگر هدایت (ریدیرکت) کند و آن فایل ممکن است حاوی کد ویروسی و آلوده ای باشد که بتواند متغیرهای گلوبال یا دکمه سابمیت فرم را به آدرس دیگری فرستاده و برای مثال اطلاعات وارد شده کاربر در فرم را در آدرس دیگری ذخیره کند.
در ادامه ارزیابی اعتبار فرم ها در php 7 می آموزیم که چگونه می توان از سوء استفاده دیگران از $_SERVER[“PHP_SELF”] جلوگیری کرد.
می توان با استفاده از تابع () htmlspecialchars از بهره برداری و سوء استفاده از [“SERVER[“PHP_SELF_$ پیشگیری کرد.
بنابرین کد فرم باید به صورت زیر تغییر کند :
1 | <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> |
با استفاده از تابع () htmlspecialchars کاراکترهای ویژه به entities های HTML تبدیل می شوند.
حالا اگر کاربری سعی کند که از متغیر PHP_SELF سوء استفاده کند، نتیجه کد وارد شده در آدرس بار به صورت زیر نمایش داده می شود :
1 | <form method="post" action="test_form.php/"><script>alert('hacked')</script>"> |
در این حالت از سوء استفاده پیشگیری شده و آسیبی وارد نخواهد شد.
ارزیابی اعتبار فرم ها در php 7 را با ارزیابی اعتبار داده های یک فرم HTML به پایان می بریم.
اولین کاری که باید در ارزیابی اعتبار داده های یک فرم HTML انجام داد، این است که تمامی متغیرهای حاوی داده فرم را از تابع () htmlspecialchars عبور داد.
زمانی که از تابع () htmlspecialchars استفاده می شود، اگر کاربر سعی کند فرمان زیر را از طریق یک فیلد متنی ارسال کند:
1 | <script>location.href('http://www.hacked.com')</script> |
این کد اجرا نخواهد شد، زیرا به صورت نسخه تبدیل شده HTML ذخیره می شود، مثل دستور زیر:
1 | <script>location.href('http://www.hacked.com')</script> |
حالا نمایش این کد بر روی صفحه یا داخل ایمیل ارسالی از فرم ایمن خواهد بود.
دو کار دیگر دیگر نیز در زمان سابمیت داده های فرم توسط کاربر می توان انجام داد :
۱- کارکترهای غیر ضروری (مثل space, tab, newline) را از داده های وارد شده توسط کاربر حذف کرد (با استفاده از تابع () trim برنامه PHP).
۲- حذف بک اسلش (\) از داده های وارد شده توسط کاربر در فرم (با استفاده از تابع () stripslashes برنامه PHP).
گام بعدی ایجاد تابعی است که تمامی بررسی های داده های وارد شده در فرم را برای ما انجام می دهد (که خیلی بهتر از آن است که هر بار کد را بنویسیم و آن را تکرار نماییم.)
ما نام این تابع را () test_input می گذاریم.
حالا می توانیم هر یک از متغیرهای POST_$ را با استفاده از تابع () test_input چک کنیم.
اسکریپت این تابع به صورت زیر خواهد بود :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?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; } ?> |
به شروع اسکریپت توجه کنید، ما ابتدا با استفاده از متد “[SERVER[“REQUEST_METHOD_$ چک می کنیم که آیا فرم سابمیت شده است یا خیر.
اگر REQUEST_METHOD به صورت POST باشد، فرم سابمیت شده است یعنی کاربر فرم را تکمیل کرده و دکمه ارسال را زده است و حالا بایستی تعیین اعتبار شود.
اگر هنوز فرم سابمیت نشده باشد، این متد یک فرم خالی را نمایش خواهد داد.
گام بعدی این است که فیلدهای ورودی مورد نیاز را ایجاد کرده و در صورت لزوم برای آن پیغام خطا تعیین نماییم.
در این جلسه به ارزیابی اعتبار فرم ها در php 7 پرداختیم.
در جلسه بعدی به آموزش فیلدهای الزامی فرم در php 7 می پردازیم.
با پی وی لرن همراه باشید.