در اين فصل وفصل بعدي فرم واعتبار سنجي آن بيان ميشود.
يكي از مراحل اعتبارسنجي امنيت اطلاعات فرم ميباشد .در صورتيكه در اين مورد اقدامي صورت نگيرد اين اطلاعات در گير عوامل مخرب مانندهكرها وهرز نامه خواهد شد.اين مخرب ها باعث ميشوند كه آنچه ميخواستيد، نشود.
دراين فصل فرمHTML كه شامل فيلدهاي ورودي متفاوت اختياري وضروري وهمچنين radio button و كليدsubmit بوده، تشريح ميگردد .شكل ونماي فرم مطابق زير است .
PHP Form Validation Example
Your Input:
قوانين اعتبار سنجي فرم مطابق جدول زيراست.
فليد | قوانين اعتبارسنجي |
---|---|
Name | فيلد ضروري وبايستي فقط شامل حروف وبلنك باشد |
E-mail | فيلد ضروري وبايدمطابق قانون آدرس ايميل باشد |
Website | قابل قبول داشته باشد Url فيلد اختياريست وبايدآدرس |
Comment | فيلداختياريست وچند خطي است |
Gender | فيلد ضروريست وبايد يكي ازموارد انتخاب شود |
نكته ـ فيلدضروريRequired field واختياريOptional ميباشد. بررسي فرمHtml با نگاه ساده به كد عناصرفرم
فيلد هايE_mail وWebsite متني هستند وبشكل زير در فرم Html كد شده اند .
Name: < input type="text" name="name">
Website: <input type="text" name="website">
Comment: <textarea name="comment" rows="5" cols="50"></textarea>
كد دكمه هاي راديوئي مطابق جدول زير ميباشد.
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 درhtml مطابق كدزيراست .
<form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]); >">
هنگاميكه كليدsubmit فرم كليد ميشود، يا خلاصه تر فرم submit ميشود، اطلاعات فرم مطابق آنچه كه درmethod مشخص شده ارسال ميگردد .دراين جا روش ارسالpost ميباشد .ارسال اطلاعات با دو روشPOST و GET ميباشد .
در دستورform عبارت$_SERVER["PHP_SELF"] چه عملي را انجام ميدهد. $_SERVER[ ] يك آرايه ابر جهاني است كه درآن اطلاعات سرور واسكريت ها رانگه ميدارد.دراينجا نام اسكريپت اجرائي را براي ارسال اطلاعات مشخص ميكند .پارامتر"PHP_SELF"يعني اسكريپت درحال اجرا اين بعنوان كليدآرايه ونام اسكريپت اجرائي مقدار آنست.
در چنين حالتي اطلاعات بخود اسكريپت اجرائي ارسال ميشود .حالت ديگري وجود دارد كه ارسال اطلاعات ميتواند به اسكريپت بيروني باشد .در حالتPHP_SELF كنترل وپيغام ها درهمان page ميباشد.
اين تابع كراكتر هاي خاص را به اجزاءhtml تبديل مي نمايد .يعني موارد < > با< و> كه معادلhtml آنها تبديل مي نمايد .دلايل زيادي براي استفاده از كراكتر خاص وجود دارد .مورد امنيتي وموارد اجرائي .موارد اجرائي بيشتر در نقل وانتقالات داخلي بصورت اتوماتيك انجام ميگيرد .اما در موارد امنيتي براي پيش گيري ازمهاجمان اسكريپتي از كراكترهاي خاص استفاده ميشود.
نكته امنيتي مهم ـ $_SERVER["PHP_SELF"] بوسيله هكرها ميتواند استفاده شود. اگر ازPHP_SELF استفاده ميشود، كاربر ميتواند يك اسلشcode>) / ( وارد كرده وبعضي از كامند هاي < XSSرا باجرا درآورد .
XSSنوعي برنامه نويسي مقابله كننده است، كه نمونه برنامه جهت مزاحمت وتخريت در بعضي از وب سايت هاي كاميوتري وجو دارد .اين برنامه نويسي مهاجمان را قادر ميسازد كه تا اسكريپت مورد خود را به صفحات ديگران تزريق كنند،وايجاد مزاحمت يا باعث تخريب شوند.
فرض كنيد فرم زير را در صفحه ايجادي"test_form.php"داشته باشيم
اكنون كاربر آدرس معمولي مشابه"http//www.example.com/test_form.ph"را در url bar وارد كند، دراين صورت دستورform بصورت زير تبديل مي.گردد .
البته اين خوب است واشكالي ندارد.اما فرض كنيد درurl bar متن زير را وارد كند .
در اين حالت كدform بصورت زير تبديل ميگردد .
< form method="post" action="test_form.php/"> <script>alert('hacked'); </script>
كد بالا يك تگscript اضافه نموده و داخل آن دستورجاوااسكريپت alert ميباشد كه پيغام "hacked" نمايش ميدهد .اين نمونه ساده ايست اما ميتوان داخل تگscript موارد زيادي را قرارداد كه مشكل ساز باشد .بعنوانه نمونه ميتواند كاربر به فايلي در سرور ديگر هدايت كند وموارد سرقت اطلاعات يا تخريب اطلاعات را انجام دهد.
براي جلوگيري از سوء استفاده تابع فوق ميتوان ازتابعhtmlspecialchars() استفاده نمود .كد فرم بايد بصورت زير باشد.
< form method="post" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>">
در اين حالت اگر مقابله كننده همان عبارت را تزريق كند، عنصرform بصورت زير تبديل ميشودكه تلاش براي سوء استفاده شكست ميخورد و موفق نخواهد بود.
<form method="post" action="test_form.php/&quit;>< script>alert('hacked')&l;/script>">
اولين مورد كه بايد انجام داد، اينست كه تابعhtmlspecialchars را براي تمام متغير هاي وابسته بفرم باجرا در بياوريم.
در صورتيكه در يك فيلد متني تگscript زيرا وارد كند
اين اجرا نميشود، چون تابع فوق كد هاي فراراز اجرا را در آن قرار داده وبصورت زير ذخيره ميشود.
كد بالا براي نمايش مورد نظر مقابله كننده امن نبوده وبراي ايميل هم غيز قابل قبول است.
نكته ـ انچكه به دريافت نمودم كراكتر هاي خاص فقط در نمايش واقعي ميشوند، اما در اجرا تغيير نخواهند كرد .يعني اگر< در متني باشد، درنمايش متن <ظاهر ميشود، ولي دراجرا تغير نميكند.
همچنين زماني كه كاربر فرم را ارسال نمود، بايد فضاي غير ضرور اطاعات را حذف نمود فضاي غير ضرور عبارتند از فضاي خالي، تب وخط جديد ميباشند .اينكار بوسيله تابعPHP trim( ) انجام ميشود .با استفاده از تابعPHP stripslashes() كراكتر/ را از اطلاعات حذف ميكنند .
براي سادگي كار كنترل اطلاعات تابعtest_input() را كه بتواند روي هر متغيري تمام اقدامات كنترلي فوق را انجام دهد مطابق مثال ايجاد شده است.
مثال ـ درمثال زير فرم و اسكريپت كنترلي اطلاعات كه بحث شد آمده است.
<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>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="5" cols="40"></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>