بار عرض سلام خدمت کاربران محترم سایت پی وی لرن. در این جلسه از سری جلسات کار با فرم ها در php به مبحث مهم اعتبار سنجی فرم ها در php می پردازیم. با ما همراه باشید.
اعتبار سنجی فرم ها یا Validation of forms امروزه یکی از اساسی ترین اقدامات برای امنیت وب سایت و جلوگیری از خرابکاری می باشد.
فرم HTML ای که ما در این جلسه با آن کار خواهیم کرد، شامل فیلد های ورودی مختلفی از جمله فیلد های متنی اخیاری یا ضروری، radio buttons و دکمه ارسال خواهد شد.
قوانین اعتبار سنجی برای فرم بالا به شرح زیر است:
توضیحات | فیلد |
ضروری – فقط شامل حروف و جای خالی باشد | Name |
ضروری – باید شامل یک آدرس ایمیل معتبر باشد(با @ و . ) | |
اختیاری – اگر وارد شد باید شامل یک URL معتبر باشد | Website |
اختیاری – فیلد متنی چند خطی (textarea) | Comment |
ضروری – فقط یکی انتخاب شود | Gener |
ابتدا نگاهی به کد HTML فرم خواهیم انداخت.
نام، ایمیل و وب سایت المان های ورودی متن هستند و فیلد نظر یک textarea هست. کد HTML به صورت زیر می باشد
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> |
فیلد جنسیت شامل radio button هست که کد 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”]_$ یک متغیر superglobal هست نام فایل اسکریپت فعلی را بر می گرداند.
بنابراین SERVER[“PHP_SELF”]_$ داده های ارسالی را به جای رفتن به یک صفحه دیگر به داخل خود صفحه ارسال می کند.
بدین ترتیب کاربر پیغام های خطای ناشی از فرم را در همان صفحه فرم دریافت می کند.
این تابع کاراکتر های خاصی را به اجزای HTML تبدیل می کند. این بدان معنی است کاراکتر های HTML مثل < و > با ;lt& و ;gt& جایگزین می کند. این کار از حملات هکر ها از طریق تزریق (injecting) کدهای HTML و javascript به داخل فرم ها جلو گیری می کند. برای آشنایی بیشتر در مورد حملات Cross-site scripting یا به اختصار XSS جستجو نمایید
متغیر SERVER[“PHP_SELF”]_$ می تواند توسط هکر ها مورد استفاده قرار گیرد!
اگر PHP_SELF در صفحه شما به کار رفته باشد، کاربر می تواند با وارد کردن اسلش ‘/’ تعدادی از دستورات 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"> |
تا الان که خوب بوده.
اما در نظر بگیرید که کاربر URL زیر را در نوار آدرس وارد کند:
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> |
این کد یک تگ اسکریپت و یک دستور alert را اجرا می کند. و وقتی صفحه بارگذاری می شود، کد جاوا اسکریپت اجرا خواهد شد (کاربر یک alert box مشاهده می کند).
این فقط یک مثال ساده و بی خطر بود تا نشان دهد متغیر PHP_SELF چطور میتواند خطرآفرین باشد.
آگاه باشید که هر کد جاوا اسکریپت می تواند داخل تگ <script> اضافه شود! یک هکر می تواند کاربر را به یک فایل روی سرور دیگری هدایت کند و این فایل می تواند یک کد مخرب داشته باشد که می تواند متغیر های سراسری را تغییر دهد و یا فرم را به یک آدرس دیگری هدایت کند تا اطلاعات کاربر را ذخیره کند.
برای جلوگیری از این تهدید کافیست تا از تابع ()htmlspecialchars استفاده نمایید.
وقتی که کاربر فرم را ارسال می کند ما دو کار انجام می دهیم:
در قدم بعدی یک تابع ایجاد می کنیم تا تمام کارهای بررسی برایمان انجام دهد. نام این تابع را ()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 $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”]_$ چک می کنیم که فرم با چه متدی ارسال شده است. اگر متد درخواستی POST باشد، فرم ارسال می شود و باید اعتبارسنجی شود.
خب جلسه اعتبار سنجی ورودی ها در php و امنیت در php نیز به پایان رسید. در جلسه بعد راجع به ایجاد پیام های خطا برای فیلد های ضروری (اگر لازم بود) خواهیم پرداخت. با پی وی لرن همراه باشید.
همچنین می توانید نظرات و سوالات خود را از طریق بخش نظرات با ما در میان بگذارید.
saeed
ممنون آموزش خوبی بود. اگه میشه آموزش الگوهای طراحی رو هم بزارید