فرض کنید سایت site.com یک سایت انجمن گفتگو، بانک یا ... پربازدید است که اگر کاربر عبارت مثلا «تست» را در آن سایت جستجو کند، به آدرس زیر منتقل میشود:http://site.com/search.php?q=تست
و در صفحه نتیجه جستجو نیز در بالای صفحه، همان عبارت جستجو عینا منعکس شده است:php
echo "نتیجه جستجوی شما برای عبارت : ", $_GET["q"];
...
خب در اینجا من میتوانم یک کد تزریق کنم مثلا بجای عبارت جستجو بنویسم:
ممکن است بگویید: اولا که این alert را فقط خود کاربر میبیند و ثانیا چه ضرر امنیتی دارد؟!
پاسخ این است که یک نفوذگر، زمانی که متوجه وجود این باگ در سایت شما شود، ابتدا یک کد ساده مانند میسازد که کوکی کاربر فعلی که در حال مشاهده صفحه است را برای وی ارسال کند مثلا:
خب در اینجا باز هم ممکن است بگویید که خب این آدرس حاوی کد خطرناک، فقط کوکی خود کسی که این کد تزریقی را نوشته به سمت سایت هکر میفرستد نه دیگران را. اما مشکل اینجاست که نفوذگر میتواند آدرس حاوی کد فوق را با یک کوتاهکننده آدرس مثل tinyurl.com کوتاه کند و سپس آن را از طریق ایمیل/انجمن/... برای دیگران ارسال کند...XSS چندگونه است و چگونه میتوان در برابر آن ایمن بود؟
مثال بالا، فقط یکی از صدها حالت XSS بود و این یادداشت کوتاه مجال بررسی همه حالات آن را ندارد و برای مطالعه بیشتر میتوانید به لینکهای انتهای مطلب مراجعه نمایید.
پس از حملات SQL Injection ، حملات XSS دومین حمله مهمی است که بر روی سایتهای اینترنتی انجام میشود:
پیشگیری از XSS آسان است. اولا که هیچیک از اطلاعاتی که توسط کاربر به شما داده شده، اعتماد نکنید؛
- ورودیهای فرمها
(ولو در دیتابیس ذخیره شده و سپس فراخوانی شده) - مواردی که همراه درخواست میآید مثل کوکی، سشنآیدی، آیپی، آدرس صفحه ارجاع و ...
و ثانیا هیچگاه به ذهن و علم ناقص خودتان برای filter کردن محتویات نامطمئن اتکاء نکنید بلکه از کتابخانههای قدرتمند و کاملی چون htmlPurifier استفاده کنید...البته اگر معماری برنامه شما MVC باشد و از تمپلت انجین معتبری نیز به صورت صحیح استفاده کرده باشید، تا حد زیادی نگرانی شما راجع به XSS مرتفع میشود.
به دلیل حالات بسیار زیاد و پیچیده حملات XSS ، لازم است دو نکته مهم را همواره در برنامهنویسی رعایت کرد:
- بخش زیادی از حملات XSS روی کوکی(از جمله سشنآیدی) انجام میشود لذا حتما در زمان ایجاد کوکیهای حساس (مثل کوکیهای احراز هویت) پرچم HttpOnly را ست کنید تا کوکیهای حساس شما توسط javascript قابل دسترسی نباشد.
- برای ویرایش اطلاعات حساس کاربر، بهتر است مجددا از وی پسورد پرسیده شود. کاری که سایتهای بزرگ مانند توییتر نیز انجام میدهند.
چند لینک مرتبط با XSS