آسیب پذیری های متقابل اسکریپت، وب سایت شما را در معرض دستکاری مهاجمان قرار می دهد. بنابراین چگونه می توانید حملات XSS را متوقف کنید؟
اسکریپت بین سایتی که به طور گسترده با نام XSS شناخته می شود، یکی از خطرناک ترین روش های حمله است که توسط مجرمان سایبری استفاده می شود، بنابراین ضروری است که هر توسعه دهنده و محقق امنیتی بداند که چیست و چگونه از حملات جلوگیری کند. بنابراین، چگونه می توانید در برابر آسیب پذیری XSS اقدام کنید؟ شما از HTML، جاوا اسکریپت یا DOM برای نشان دادن داده هایی که یک وب سایت از کاربر دریافت می کند استفاده می کنید. یک یا چند مورد از این سه حوزه مختلف می توانند با هم کار کنند.
نحوه جلوگیری از XSS با استفاده از HTML
XSS به مهاجمان اجازه می دهد تا کدها یا اسکریپت های مخرب را به صفحات وب تزریق کنند و کاربران ناآگاهی را که از سایت بازدید می کنند هدف قرار دهند. این میتواند دادههای شخصی را به سرقت ببرد، بازدیدکنندگان را به سایت دیگری که توسط مجرم سایبری راهاندازی شده هدایت کند، یا ظاهر صفحه وب را دستکاری کند. اما شما می توانید از این اتفاق جلوگیری کنید. به عنوان مثال، با متوقف کردن آنها در وارد کردن HTML.
تصور کنید یک وب سایت با دفترچه مهمان دارید. فرض کنید بازدیدکنندگان شما با استفاده از این دفترچه مهمان می توانند نام و پیام های خود را در اینجا بنویسند و پیام های آنها را می توان به صورت عمومی مشاهده کرد. مهاجمی که می خواهد یک تست XSS در دفترچه مهمان شما انجام دهد، از منطقه ای که شما برای نوشتن پیام اختصاص داده اید استفاده می کند. آن مجرم سایبری یک کد جاوا اسکریپت را در اینجا اجرا می کند. به عنوان مثال، یک مهاجم می تواند از کدهای جاوا اسکریپت مانند:
<script>alert("The XSS!")</script>
مهاجم باید از یک تگ اسکریپت برای موفقیت استفاده کند. اگر این کار را نکنند، کد جاوا اسکریپت کار نخواهد کرد. شما باید عبارت < را رمزگذاری کنید تا کاربران هرگز نتوانند از تگ های HTML استفاده کنند. این کار کار مهاجم با تگ های HTML را دشوار می کند.
نحوه جلوگیری از XSS با استفاده از جاوا اسکریپت
منطق موجود در HTML در جاوا اسکریپت نیز معتبر است. در برخی از اپلیکیشن ها امکان چاپ داده های دریافتی وب سایت از کاربر با کد جاوا اسکریپت وجود دارد.
این کدگذاری را در نظر بگیرید:
<p id="print"></p>
<script>
document.getElementById("test").innerHTML = "<!--?php echo $_GET["search"]?-->";
</script>
تصور کنید یک وب سایت از یک بلوک کد مانند مورد بالا استفاده می کند. توسعه دهنده در اینجا از یک تگ “p” به نام “print” استفاده کرده است. همانطور که از کد می بینید، یک مقدار از پارامتر “جستجو” می آید، و توسعه دهنده می خواهد این مقدار ورودی را در تگ “p” نشان دهد. توسعه دهنده ای که این عملیات را انجام داده می خواست از ویژگی innerHTML جاوا اسکریپت استفاده کند.
حال بیایید از دید مهاجم سایبری به وضعیت نگاه کنیم. در چنین حالتی، مهاجم یک تست XSS را در تگ “اسکریپت” انجام می دهد. برای این، مهاجم نیازی به راه اندازی مجدد برچسب ندارد، زیرا یک تگ “اسکریپت” که قبلاً در حال استفاده است. سپس مهاجم می تواند آزمایشی مانند این بنویسد:
filename.php?search=a" alert("The XSS!"); f= "
این کد به صورت زیر در وب سایت ظاهر می شود:
document.getElementById("test").innerHTML = " a" alert("The XSS!"); f=" ";
آن حمله موفقیت آمیز خواهد بود. برای درک بهتر موضوع، اجازه دهید یک تکنیک نمونه دیگر را که یک مهاجم میتواند از آن استفاده کند، بررسی میکنیم. هکر ممکن است یک تست XSS مانند:
filename.php?search=";</script><em>Fatih</em>
این چیزی است که وقتی از وب سایت مشاهده می شود به نظر می رسد:
document.getElementById("test").innerHTML = " ";</script><em>Fatih</em> ";
این ممکن است کمی عجیب به نظر برسد زیرا مهاجم اولین تگ “script” را با استفاده از ساختاری مانند “/script” در اینجا بسته است. و بنابراین، مهاجم می تواند هر کد جاوا اسکریپت و HTML را که بخواهد راه اندازی مجدد کند.
اگر به این دو مثال مختلف فکر می کنید، محافظت از XSS بسیار ساده به نظر می رسد. احتیاط لازم این است که کاراکترهای ” و ” را که در مثال اول می بینید رمزگذاری کنید. در مثال دوم، کاراکترهای < و > را رمزگذاری کنید.
نحوه جلوگیری از XSS با استفاده از DOM
در این نوع XSS، دادههایی که وبسایت از کاربر دریافت میکند میتواند با ویژگی یک عنصر DOM تداخل داشته باشد. به عنوان مثال، اطلاعات رنگی که سایت از کاربر دریافت می کند می تواند بر رنگ پس زمینه یک جدول یا کل پس زمینه صفحه تأثیر بگذارد. بنابراین کاربر ناخواسته در چیدمان سبک بدنه و میز دخالت می کند. کد زیر مثال خوبی برای این کار است:
<body bgcolor="<?php echo $_GET['color']; ?>"/>
با این کار، وب سایت از پارامتر “color” دریافت شده از کاربر به طور مستقیم در ویژگی “bgcolor” عنصر “body” استفاده می کند. بنابراین یک مهاجم در این مرحله چه کاری می تواند انجام دهد؟ آنها می توانند این کد مخرب را اجرا کنند:
filename.php?color=red" onload="alert('The XSS!')
وقتی از وبسایت مشاهده میشود، به این شکل به نظر میرسد:
<body bgcolor=" red" onload="alert('The XSS!') "/>
برای جلوگیری از این اتفاق، توسعه دهنده باید کاراکتر ” را رمزگذاری کند.
با این حال، یک عنصر مهم دیگر در جاوا اسکریپت وجود دارد که باید به آن توجه کرد. قطعه کد زیر یک نمونه برای این است:
<a href="javascript:alert('The XSS!')">
این بدان معناست که امکان اجرای مستقیم برخی از کدهای جاوا اسکریپت وجود دارد. یکی از بهترین اقدامات پیشگیرانه این است که مطمئن شوید وب سایت بررسی می کند که آیا داده هایی که از کاربران دریافت می کند یک URL واقعی هستند یا خیر. ساده ترین روش این است که مطمئن شوید عباراتی مانند “HTTP” و “HTTPS” (نسخه امن HTTP) در اتصال وجود دارد.
یک تابع مثال برای جلوگیری از XSS با PHP
نمونه هایی از نحوه محافظت از یک برنامه یا وب سایت در برابر حملات XSS را مشاهده کرده اید. می توانید از کدهای این جدول با PHP استفاده کنید:
کد گذاری در HTML
htmlspecialchars ($str، ENT_COMPAT)
کدگذاری در جاوا اسکریپت و ویژگی DOM
htmlspecialchars ($str، ENT_NOQUOTES)
بررسی URL
‘/^(((https?)|(\/\/))).*/’;
توجه داشته باشید که اینها فقط نمونه هایی هستند و بسته به زبان نرم افزاری که استفاده می کنید متفاوت خواهد بود.
می توانید یک برنامه وب با PHP ایجاد کنید و کدهایی را که در بالا می بینید امتحان کنید تا آنها را به صورت متن ارسال کنید. اگر نمیدانید چگونه از همه این روشها استفاده کنید، میتوانید ایدههایی را از بلوک کد PHP زیر دریافت کنید، که حتی اگر از زبان دیگری استفاده میکنید مفید باشد:
<?php
$data = $_GET['data'];
function in_attribute($str){
return htmlspecialchars($str, ENT_COMPAT);
// ENT_COMPAT will encode the double quote (") character.
}
function in_html($str){
$link = '/^(((https?)|(\/\/))).*/';
if(!preg_match($link, $str))
{
return "/";
}
return $str;
}
$data = in_attribute($data);
$data = in_html($data);
$data = real_url(data);
?>
از وب سایت خود در برابر XSS و موارد دیگر محافظت کنید
XSS یک بردار حمله محبوب است که توسط هکرها استفاده می شود. معمولاً، یک مقدار مسیر در URL، هر فیلدی در وبسایت شما که میتوان دادهها را در آن وارد کرد (مانند فیلدهای فرمها و نظرات)، میتواند برای آزمایش آسیبپذیری XSS استفاده شود. اما مطمئناً روشهای مختلفی وجود دارد که مجرمان سایبری میتوانند از آن برای حمله به یک سایت استفاده کنند، به خصوص اگر وبسایتی دارید که کاربران زیادی دارد و اطلاعات آنها را پنهان میکند.