سلام
بالاخره فرصتي بشد براي ادامه آموزش !
در مورد حملا xss صحبت كرديم اما راه حلي ارائه نشد !
بنابراين در ابتدا به مقابله با اين حملات ميپردازيم
براي نمايش پيغام ها به جاي اينكه مستقيما از
کد PHP:
echo $_GET['msg'];
استفاده كنيم ميتونيم ابتدا رشته رو خنثي سازي كنيم ! يعني رشته رو از وجود تگ هاي html و جاوا اسكريپت و... خنثي كنيم.
به عنوان نمونه با تابع strip_tags ميتونيم تمام تگهاي js و html رو حذف كنيم.
ممكن هست بخواهيم همه تگها (براي نمونه : ) جز تگ <br> حذف بشند كه در اينصورت در پاراكتر دوم تابع strip tags از br (و ليست ساير تگ ها مجاز انتخابي ) استفاده ميكنم
خوشبختانه منوال php به قدري غني هست كه به وضوح اين توابع با مثال هايي توضيح داده شدند و جاي مثال اضافي نيست !
PHP: strip_tags - Manual
Example #1 strip_tags() example
کد PHP:
<?php
$text = '<p>Test paragraph.</p><!-- Comment --> <a href="#fragment">Other text</a>';
echo strip_tags($text);
echo "\n";
// Allow <p> and <a>
echo strip_tags($text, '<p><a>');
?>
The above example will output:
Test paragraph. Other text
<p>Test paragraph.</p> <a href="#fragment">Other text</a>
تابع htmlspecialchars :
اين تابع هم تابع مفيدي براي خنثي كردن كدهاي html هست.در واقع كدهاي html در اين تابع حذف نميشند بلكه با كاركترهايي مناسب جايگزين و قابل نمايش (به جاي اجرا)ميشند.
PHP: htmlspecialchars - Manual
* اين توابع رو بعدا به طور جامع در يك پست توضيح ميدم و در نهايت با كمك مجموعه اين توابع تابعي ميسازيم كه بتونه تمام متغير ها و آرايه هاي ورودي رو براي ما امن كنه و تاحدودي زيادي جلوي حملات xss و sql injection رو به صورت خودكار بگيريم !
اما ! اين روش از نظر من كلا اشتباست.
دليلي وجود نداره كه پيغام مورد نمايش رو از طريق post يا get ارسال كنيم تا چنين مشكلاتي پيش بياد.
فرض كنيد :
کد PHP:
<?php
$msg = array(
'login' => 'Please Login',
'faield' => '<font color=red><b>Login failed !</b></font>',
'success' => '<font color=green><b>Login was successfull !</b></font>',
);
if(isset($_GET['msg']))
if(isset($msg[$_GET['msg']]))
die($msg[$_GET['msg']]);
else
die('invalid msg !');
?>
فكر كنم واضح باشه ، اما بهرحال باز در فرصتي مناسب توضيحات بيشتري ميدم.