سرفصلهای پست
آموزش طراحی سایت با PHP – اعتبارسنجی فرم در php
درود به همراهان گرامی میزفا . با یک جلسه دیگه از آموزش طراحی سایت با پی اچ پی کنار شما عزیزان هستم. در جلسه گذشته از آموزش PHP به نحوه جمع آوری اطلاعات از طریق متد POST و GET در PHP پرداختیم . در این جلسه با اعتبارسنجی فرم در php آشنا خواهیم شد.
اعتبارسنجی فرم در PHP
در این فرم یک سری محدودیت ها برای اعتبارسنجی فرم در php برروی فیلد ها اعمال شده است .
مشروح آن ها را در جدول زیر خواهید دید.
نام فیلد | اعتبارسنجی |
نام | الزامی است. فقط حروف الفبا و خط فاصله را می پذیرد |
ایمیل | الزامی است. باید حاوی فرمت صحیح ایمیل باشد (به همراه علامت @ و .) |
وب سایت | اختیاری است. در صورتی که پر شود باید فرمت url داشته باشد. |
نظرات | اختیاری است. می تواند شامل چندین خط متن باشد. |
جنسیت | الزامی است. یکی از موارد می تواند انتخاب شود. |
در فرم بالا درصورتی که فیلدهای اجباری را خالی رها کنید، با خطای فیلد اجباری است روبرو خواهید شد .
یا اگر هر قانون را رعایت نکنید با پیغام خطای آن مواجه خواهید شد.
ابتدا نگاهی به کدهای html برای ساخت فرم بیاندازیم.
فیلدهای متنی
فیلد نام ، ایمیل و وب سایت از نوع text و فیلد نظرات textarea می باشد.
نام: <input type="text" name="name"> ایمیل: <input type="text" name="email"> وب سایت: <input type="text" name="website"> نظرات: <textarea name="comment" rows="5" cols="40"></textarea>
دکمه های رادیویی
برای پیاده سازی فیلد جنسیت از نوع radio استفاده کرده ایم.
جنسیت: <input type="radio" name="gender" value="female">زن <input type="radio" name="gender" value="male">مرد
عنصر فرم
کد html فرم به شکل زیر است :
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
زمانی که فرم ارسال می شود از طریق متد پست اطلاعات جمع آوری می شود. برای کسب اطلاعات بیشتر درباره متغیر سوپرگلوبال SERVER_$ به بخش متغیر superglobal در php مراجعه کنید.
htmlspecialchars چه کاری می کند؟
با استفاده از تابع ()htmlspecialchars، می توان کاراکترهای خاص را به HTML entity تبدیل کرد . به این معنا که کاراکترهایی مثل علامت کوچکتر (<) و بزرگتر (>) در پارامتر ورودی را به ;lt$ و ;gt$ تبدیل می نماید .
این تابع می تواند از حمله ی هکرهایی که می خواهند از طریق تزریق کدهای HTML یا JavaScript اختلال ایجاد کنند ، جلوگیری کند.
تذکر مهم در امنیت فرم در php
در مثال بالا از PHP_SELF
استفاده کردیم . این دستور میتواند مورد استفاده ی هکر ها قرار بگیرد . هکرها میتوانند در آدرس بار مرورگر بعد از آدرس فایل، یک اسلش (/) قرار دهند و سپس دستورات XSS را برای اجرا تایپ کنند.
اما دستورات XSS چی هستند؟
دستورات XSS
دستورات Cross-site scripting که به اختصار XSS نیز نامیده می شوند یک نوع قابلیت آسیب پذیری امنیت کامپیوتر است که معمولا در برنامه های کامپیوتری تحت وب دیده می شود. هکرها می توانند با تزریق اسکریپت های سمت کاربر به اطلاعات دستبرد بزند .
برای درک بهتر به مثال پایین توجه کنید.
در نظر بگیرید که فایلی با نام 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('hacked')%3C/script%3E
در این صورت کد بالا بصورت زیر ترجمه خواهد شد:
<form method="post" action="test_form.php/"><script>alert('hacked')</script>
دومین URL ، سبب اضافه شدن تگ <script> و یک دستور alert در بین کدهای ما شده است. زمانی که صفحه لود می شود ، کد JavaScript اجرا می شود (در این مثال کاربر یک جعبه پیغام با محتوای hacked را مشاهده خواهد کرد). این فقط یک مثال ساده و بی ضرر است که نحوه هک کردن متغییر PHP_SELF را نشان می دهد.
در نظر داشته باشد که هر کد JavaScript دیگری را می توان در تگ <script> قرار داد . یک هکر می تواند کاربر را به یک فایل دیگر روی سروری دیگر redirect کند ، و از طریق آن فایل، اطلاعات کاربر را به سرقت ببرد.
چگونه از خطرات [“SERVER[“PHP_SELF_$ جلوگیری کنیم؟
تابع ()htmlspecialchars راهی برای مقابله با هک شدن است. در صورتی که بخواهیم کد بالا را در حالت امن بنویسیم به صورت زیر خواهد شد :
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
تابع ()htmlspecialchars، کاراکترهای خاص را به HTML entity (عناصر زبان html) تبدیل می کند. در این صورت اگر کاربر بخواهد از متغیر “PHP_SELF” سوء استفاده کند ، با نتیجه مواجه خواهد شد :
<";form method="post" action="test_form.php/"><script>alert('hacked')</script>>
در نتیجه از این طریق هیچ گونه آسیبی وارد نخواهد شد.
اعتبارسنجی داده های فرم با PHP
در اولین گام اعتبارسنجی فرم در php باید تمام متغیرها را به تابع ()htmlspecialchars
پاس بدهیم .
در این حالت اگر متنی مطابق زیر را ارسال کند :
<script>location.href('http://www.hacked.com')</script>
تلاش کاربر بی نتیجه خواهد بود زیرا کاراکتر های خاص در متن بالا به HTML entity تبدیل خواهند شد:
;lt;script>location.href('http://www.hacked.com')</script>&
حالا این کد برای استفاده در صفحات و یا داخل ایمیل امن خواهد بود .
همچنین ما برای افزایش امنیت از دو مورد زیر نیز استفاده کرده ایم :
- با استفاده از تابع
()trim
کاراکترهای غیرضروری (مانند : فاصله های اضافی، tab و خطوط خالی ) را حذف می کنیم. - با استفاده از تابع
()stripslashes
، بک اسلش ها (\) را حذف می کنیم.
در گام بعدی تابعی را برای انجام کلیه ی دستورات ایجاد می کنیم. (به جای آنکه کدهای مربوط به این قسمت را بارها و بارها بنویسیم، بهتر است که از یک تابع استفاده کنیم)
در این جا ما تابعی با نام ()test_input ایجاد کردیم . در نتیجه می توانیم به ازای هر مقدار از متغیر POST_$ این تابع را فراخوانی کنیم . این تابع حاوی دستورات زیر است :
<!DOCTYPE HTML> <html> <head> </head> <body> <?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; } ?> <h2>Mizfa.com 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="5" cols="40"></textarea> <br><br> Gender: <input type="radio" name="gender" value="female">Female <input type="radio" name="gender" value="male">Male <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>
خروجی به شکل زیر است :
پی اچ پی آموزان عزیز امیدوارم این قسمت براتون مفید واقع بشه . در جلسات آینده به سری پست های کنترل فرم در php می پردازیم . در صورت وجود انتقاد ، پیشنهاد ، و نظرات خود ما رو در جریان بگذارید.
منبع : w3schools
یک پاسخ
درود
در مقابل Name کاراکترهای <" ظاهر شده و هیچ کنترلی صورت نمی گیرد