آموزش فرم ها در PHP – اعتبار سنجی
سلام
در این قسمت از آموزش فرم ها در PHP می پردازیم به مبحث بسیار مهم اعتبار سنجی داده های فرم، اگر فرم هایی که در سایت استفاده میکنیم اعبتار سنجی نداشته باشند امنیت سایت را به شدت تحت تاثیر خود قرار میدهند، لذا در این مطلب آموزشی به طور کامل، اعتبار سنجی داده های فرم را شرح میدهیم، در ادامه همراه بپرسم باشید.
فرم HTML که در این آموزش استفاده میکنیم حاوی فیلدهای متنی، دکمه های رادیویی و دکمه ها می باشد که برخی فیلدها اجباری و برخی فیلد ها ضروری هستند.
کد فرم:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ |
<form method="post" action=""> Name: <input type="text" name="name" value=""> <span class="error">* </span> <br><br> E-mail: <input type="email" name="email" value=""> <span class="error">* </span> <br><br> Website: <input type="text" name="website" value=""> <span class="error"></span> <br><br> Comment: <textarea name="comment" rows="۵" cols="۴۰"></textarea> <br><br> 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 <span class="error">* </span> <br><br> <input type="submit" name="submit" value="Submit"> </form> |
خروجی کد بالا:
پس فرمی که در انتهای آموزش باهاش کار میکنیم، فرم بالا هست، سعی کردیم در فرم انواع INPUT ها را بیاریم.
قوانینی که برای اعتبار سنجی فرم بالا در نظر گرفتیم، به شرح زیر است:
فیلد |
قوانین |
Name |
این فیلد ضروری هست و فقط نام هایی را ثبت میکند که شامل حروف و فضای خالی باشند. |
|
این فیلد ضروری هست و فقط ایمیل هایی را ثبت میکند که از قوانین ایمیل در آنها رعایت شده باشد، شامل @ و . باشند. |
Website |
این فیلد اختیاری هست و آدرس سایت وارد شده باید صحیح باشد |
Comment |
این فیلد اختیاری هست و هر کاراکتری را قبول میکند. |
Gender |
این فیلد ضروری هست و کاربر فقط میتواند یک گزینه را انتخاب کند |
ابتدا به کد HTML ساده ی فرم نگاهی بندازیم:
فیلدهای متنی
فیلدهای Name,E-mail,Website فیلدهای متنی فرم ما هستند، که کدهای آنها به صورت زیر است:
۱ ۲ ۳ ۴ |
Name: <input type="text" name="name"> E-mail: <input type="text" name="email"> Website: <input type="text" name="website"> Comment: <textarea name="comment" rows="۵" cols="۴۰"></textarea> |
دکمه های رادیویی
انتخاب جنسیت(Gender) از نوع دکمه های رادیویی هستند و کاربر فقط یک گزینه را میتواند انتخاب کند، کدهای آنها به صورت زیر است:
۱ ۲ ۳ ۴ |
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 |
تگ Form
تگ form که در کدهای بالا استفاده کردیم بدین صورت است:
۱ |
<form method="post" action=""> |
در کد بالا اطلاعات فرم با متد POST ارسال میشه(اگر در رابطه با این متذ اطلاعاتی ندارید، آموزش ارسال داده های فرم را مطالعه کنید)، برای خاصیت action در تگ form همانطور که می بینید چیزی ننوشتیم، وقتی برای action آدرسی را مشخص نکنید به این معناست که اطلاعات ارسال شده را به همین صفحه ارسال کنه.
حالا برای اینکه تگ Form رو امنیتش رو بالا ببریم، برای خاصیت action به صورت زیر عمل میکنیم:
۱ |
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> |
در این تکه کد، باز هم اطلاعات را به صفحه ی جاری ارسال میکند و ولی اطلاعات ارسالی را غربالگری میکند، در ادامه دو تابع SERVER_$ و PHP_SELF را توضیح میدیم:
- تابع SERVER[“PHP_SELF”] : متغییر SERVER_$ یک متغیر سوپر گلوبال هست که اطلاعات زیادی را در خود به صورت آرایه نگه میدارد، یکی از این اطلاعات برگرداندن نام جاری فایل می باشد.
- htmlspecialchars: با استفاده از تابع ()htmlspecialchars، می توان کاراکترهای خاص را به HTML entity تبدیل نمود. منظور این است که کاراکترهایی مثل علامت کوچکتر(<) و بزرگتر(>) در پارامتر ورودی را به ;lt$ و ;gt$ تبدیل می کند. با این کار از حمله ی هکرهایی که می خواهند از طریق تزریق HTML یا JavaScript اخلال ایجاد کنند، جلوگیری می شود.
پس تا الان باید متوجه استفاده <?php echo htmlspecialchars($_SERVER[“PHP_SELF”]?> شده باشید، تابع htmlspecialchars برای تصحیح کاراکترهای مخرب و غیر معمولی هست که هکر نتواند از طریق تزریق کدهای JavaScript یا HTML که به این نوع هک کردن در اصطلاح Cross-site Scripting attacks گفته میشود، و تابع SERVER[“PHP_SELF”] هم برای برگرداندن آدرس فایل جاری هست که اطلاعات رو به همین صفحه ارسال کنه.
نکته بسیار مهم در رابطه با امنیت فرم در PHP
متغیر SERVER[“PHP_SELF”] توسط هکرها میتواند مورد استفاده قرار گیرد!
اگر از PHP_SELF در تگ form استفاده کنید، هکر میتواند با گذاشتن یک اسلش(/) اقدام به اجرای دستورات XSS کند.
Cross-site scripting که در اصطلاح XSS نامیده میشود، یکی از روش های حمله و نفوذ هکرها به وب سایت می باشند، این روش معمولا در برنامه های تحت وب به کار میرود، در این روش کدهای JavaScript و HTML به سایت تزریق میشوند. در واقع هکرها در این توع حمله میتوانند اطلاعات کاربران یک سایت را بدون اینکه خودشان متوجه شوند، به سرقت ببرند!
لذا این باگ را در برنامه هایی که مینوسید بسیار جدی بگیرید
در ادامه یک حمله ی ساده توسط این روش را میگیم تا درک بیشتری داشته باشید:
فرض کنید فرم زیر را در صفحه ای به نام test-form.php داریم:
۱ |
<form method="post" action="<?php echo $_SERVER["PHP_SELF"];?>"> |
اگر کاربر به آدرس 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('Hacekd By beporsam.ir')%3C/script%3E |
کد بالا به صورت زیر ترجمه میشود:
۱ |
<form method="post" action="test-form.php/"><script>alert('Hacked By beporsam.ir')</script> |
وقتی هکر این آدرس را در مرورگر خود وارد کند، به محض لود شدن صفحه پیغامی در صفحه با متن Hacked By beporsam.ir چاپ میشود، البته این پیغامی که چاپ میشود بی ضرر است، ولی فرض کنید که هکر اطلاعات کاربران را به صفحه ی دیگه ای ریدایرکت کند، اون موقع چه اتفاقی می افته …، این مثال را برای این زدیم که ببینید متغیر PHP_SELF چطوری مورد سوء استفاده قرار میگیره، در ادامه یاد میگریم که چطوری با این روش مقابله کنیم.
نحوه جلوگیری از هک توسط PHP_SELF
توسط از تابع ()htmlspecialchars، می توانیم از هک شدن توسط PHP_SELF جلوگیری کنیم.
تابع ()htmlspecialchars کاراکترهای خاصی را به اجزای HTML تبدیل می کند. در حال حاضر اگر کاربر سعی می کند از متغیر PHP_SELF استفاده کند، خروجی زیر را به وجود می آورد:
۱ |
<form method="post" action="test-form.php/"><script>alert('Hacked By beporsam.ir')</script>"> |
که کدهای JavaScript و HTML بی اثر میشوند و هیچ آسیبی نخواهید دید 🙂
تا اینجا که فقط در رابطه با جلوگیری از هک توسط خاصیت action توضیح دادیم و جلوش رو گرفتیم، حالا می پردازیم به مبحث اصلی که چگونگی اعتبار سنجی داده های فرم می باشد.
اعتبار سنجی داده های فرم PHP
اولین کاری که باید انجام دهید این هست که تمامی ورودی ها را از فیلتر تابع ()htmlspecialchars عبور دهید تا پاک شوند.
زمانی که از تابع ()htmlspecialchars استفاده کنید، هکر دیگر نیمتواند با وارد کردن آدرس زیر در سایت ما کاری انجام دهد و به هدف خود برسد:
۱ |
<script>location.href('https://beporsam.ir')</script> |
قطعه کد جاوا اسکریپتی که در بالا نوشتیم، به محض لود شدن صفحه، کاربر را از سایت ما به سایت beporsam.ir منتقل میکند.
ولی وقتی که از ()htmlspecialchars استفاده میکنیم، آدرس بالا به آدرس زیر تبدیل و بی اثر میشود:
۱ |
<script>location.href('https://beporsam.ir')</script> |
حالا داده ی ارسال شده به سمت سرور امن هست.
با استفاده از تابع ()trim کاراکترهای غیرضروری (مثل: فاصله های اضافی، tab و خطوط خالی) را حذف می کنیم.
وقتی کاربر داده های فرم را ارسال میکند،؛ دو کار دیگر نیز انجام میدهیم:
- فاصله های اضافی، خط های اضافی و … را با استفاده از تابع ()trim حذف میکنیم.
- بک اسلش ها(/) را نیز با تابع ()stripslashes حذف میکنیم.
برای راحتی کار خودمون یک تابع می نویسیم که تمام این کارها رو انجام دهد.
پس تابعی به اسم filterInput می نویسیم:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ |
<?php // تابعی که نوشتیم و داده های ارسالی را قبلا از ارسال از این تابع عبور میدهیم function filterInput($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } // تغریف متغیر ها و دادن مقدار اولیه خالی به هر کدام $name = $email = $gender = $comment = $website = ""; // چک میکنیم اگر متد ارسالی برابر پست بود، مقادیر را از فرم دریافت کند // و از تابعی که نوشتیم، عبور دهد تا داده هایی بی عیب و نقص داشته باشیم. if ($_SERVER["REQUEST_METHOD"] == "POST") { $name = filterInput($_POST["name"]); $email = filterInput($_POST["email"]); $website = filterInput($_POST["website"]); $comment = filterInput($_POST["comment"]); $gender = filterInput($_POST["gender"]); } ?> |
حالا تمامی کدهای فرم تا به این لحظه که نوشتیم، به صورت زیر است:
۱ ۲ ۳ ۴ ۵ ۶ ۷ ۸ ۹ ۱۰ ۱۱ ۱۲ ۱۳ ۱۴ ۱۵ ۱۶ ۱۷ ۱۸ ۱۹ ۲۰ ۲۱ ۲۲ ۲۳ ۲۴ ۲۵ ۲۶ ۲۷ ۲۸ ۲۹ ۳۰ ۳۱ ۳۲ ۳۳ ۳۴ ۳۵ ۳۶ ۳۷ ۳۸ ۳۹ ۴۰ ۴۱ ۴۲ ۴۳ ۴۴ ۴۵ ۴۶ ۴۷ ۴۸ ۴۹ ۵۰ ۵۱ ۵۲ ۵۳ ۵۴ ۵۵ ۵۶ ۵۷ ۵۸ ۵۹ ۶۰ ۶۱ ۶۲ ۶۳ |
<!DOCTYPE HTML> <html> <head> </head> <body> <?php // تابعی که نوشتیم و داده های ارسالی را قبلا از ارسال از این تابع عبور میدهیم function filterInput($data) { $data = trim($data); $data = stripslashes($data); $data = htmlspecialchars($data); return $data; } // تغریف متغیر ها و دادن مقدار اولیه خالی به هر کدام $name = $email = $gender = $comment = $website = ""; // چک میکنیم اگر متد ارسالی برابر پست بود، مقادیر را از فرم دریافت کند // و از تابعی که نوشتیم، عبور دهد تا داده هایی بی عیب و نقص داشته باشیم. if ($_SERVER["REQUEST_METHOD"] == "POST") { $name = filterInput($_POST["name"]); $email = filterInput($_POST["email"]); $website = filterInput($_POST["website"]); $comment = filterInput($_POST["comment"]); $gender = filterInput($_POST["gender"]); } ?> <h2>PHP Form Validation Example</h2> <form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>"> Name: <input type="text" name="name"> <br><br> E-mail: <input type="text" name="email"> <br><br> Website: <input type="text" name="website"> <br><br> Comment: <textarea name="comment" rows="۵" cols="۴۰"></textarea> <br><br> 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 <br><br> <input type="submit" name="submit" value="Submit"> </form> <?php echo "<h2>Your Input:</h2>"; echo $name; echo "<br>"; echo $email; echo "<br>"; echo $website; echo "<br>"; echo $comment; echo "<br>"; echo $gender; ?> </body> </html> |
در فرم بالا تمامی فیلد ها اختیاری هستند و کاربر میتواند فیلد ها تکمیل کند و ارسال کند، در قسمت بعدی یاد میگریم که چطوری میتونیم برخی فیلدها را ضروری کنیم تا حتما توسط کاربر تکمیل شود.
در قسمت بعدی نیز همراه ما باشید.
موفق باشید.
ارسال نظر
شما باید وارد شوید یا عضو شوید تا بتوانید نظر ارسال کنید