چطور سایت هامون رو در برابر حملات XSS مقاوم کنیم ؟

چطور سایت هامون رو در برابر حملات XSS مقاوم کنیم ؟

در حملات XSS یا Cross Site Scripting هکر سعی میکنه با هر کلکی یک کد جاوا اسکریپت رو وارد یک سایت کنه و شما هم به طور ناخواسته اون کد رو اجرا میکنید. XSS در واقع یک نوع injection یا تزریق هست. یک مثال عالی برای توضیح injection وجود داره.فرض کنید سیستم مدیریت مدرسه اطلاعات دانش آموزانش رو به این صورت توی دیتابیس ذخیره میکنه:INSERT INTO students (last_name, first_name) VALUES (‘&quot
+ lastName + &quot’, ‘&quot + firstName + &quot’)اگر اسم دانش آموز arman zanjani باشه این کوئری به این شکل خواهد بود:INSERT INTO students (last_name, first_name) VALUES (‘arman’, ‘zanjani’)حالا اگه اسم کوچیک یه دانش آموز Robert’);DROP TABLE Students; باشه چی ؟ کوئری این شکلی میشه:INSERT INTO students (last_name, first_name) VALUES (‘XKCD’, ‘Robert’); DROP TABLE Students;– ‘) در اصل دو تا دستور اجرا میشه. حواستون باشه که ; پایان یک دستور رو مشخص میکنه. ما با دستور دوم یعنی: DROP TABLE Students;کار داریم. اطلاعات کل دانش آموزان پاک شد :). هیچوقت به ورودی کاربر نباید اعتماد کرد. به جای اینکه ورودی رو مستقیم توی کوئری استفاده کنیم باید به روش هایی اون رو sanitize کنیم. در مورد این بعدا توضیح میدم. XSS هم یک نوع تزریق به حساب میاد. بیاید برای این هم یک مثال ببینیم.فرض کنید یک سایت داریم که آدم ها میتونند توش حساب باز کنند و یک صفحه پروفایل داشته باشند:<body>
<h1>
Carl Anderson
</h1>
<section class=&quotabout-me&quot>
<!– blah blah blah –>
</section>
</body>اسمتون رو خودتون انتخاب میکنید. در اینجا اسم طرف Carl Anderson هست. ولی اگه اسممون رو alert(&quotHello&quot)بگذاریم چی؟ صفحه مربوط به پروفایل شما این شکلی میشه:<body>
<h1>
alert(&quotHello&quot)
</h1>
<section class=&quotabout-me&quot>
<!– blah blah blah –>
</section>
</body>تگ script هر جایی میتونه باشه. قبول دارید که هر کاربری که از صفحه پروفایل شما بازدید کنه کد های توی تگ script براش اجرا میشه؟ در اینجا فقط یک alert ساده گذاشتیم. ولی خدا میدونه چه چیز های بد تری میتونه باشه. ممکنه:از طرف شما یک ریکوئست به سرور بفرسته و اطلاعات حساس رو برای هکر ارسال کنه.اطلاعات توی localHost و کوکی های شما رو برای هکر ارسال کنه.یک event listener برای ماوس یا کیبورد شما تنظیم کنه و هر کلیدی که میزنید رو برای هکر ارسال کنه!حملات XSS فراگیرترین و پر تکرار ترین نوع حملات هکری است. هر چند بی نهایت راه برای انجام این نوع حمله ها وجود داره، جلوگیری از اونها واقعا آسونه. خیلی وقت ها با یک کتابخونه ساده میشه از خودمون محافظت کنیم.اصل مهم همه این راه حل ها یک جمله است: به هر چیزی که کاربر وارد میکند اعتماد نکنید. حالا شاید بگید که ما نیاز داریم اسم کاربر رو بگیریم. ینی چی بهش اعتماد نکنیم! راه حل شما sanitize کردن هست که به آن خواهم پرداخت…در مورد بقیه فریم ورک ها نمیدونم ولی ری اکت میتونه تا حدی شما رو از این حملات محافظت کنه.مثلا مقدار های string به صورت خودکار escape میشوند. یعنی وقتی توی string تگ script وجود داره از نظر ری اکت فقط یک متن ساده است نه یک تگ html!البته هنوز چیز هایی هست که باید هواستون بهش باشه. به شدت توصیه میکنم stack overflow زیر رو بخونید. https://stackoverflow.com/questions/33644499/what-does-it-mean-when-they-say-react-is-xss-protected فرض کنید سایتی دارید که یک فیلد داره. کاربر میتونه توی فیلد هر چیزی وارد کنه و نتیجه اون رو توی یک iframe ببینه. اگر با تگ iframe آشنا نیستید باید بگم که این مثل یک صفحه html جدا میمونه! خودش یک ویژگی به نام srcdoc داره که چیز هایی که میخوایم توی iframe باشه رو مینویسیم. مثل innerHtml میمونه.برنامه اینجوری کار میکنه: هر وقت کاربر چیزی وارد کرد، srcdoc مربوط به iframe رو به ورودی کاربر تغییر میده.میتونه یک کد جاوااسکریپت هم بنویسیم!به محض اینکه پرانتز alert رو بستم یک alert ظاهر شد. حالا دیگه خدا میدونه چه چیز هایی میتونه باشه.گفتم که srcdoc مثل innerHtml میمونه. هر وقت نیاز داشته باشید که innerHtml یک چیز رو تغییر بدید باید قبل از این کار ورودی رو sanitize یا سم پاشی کنید 🙂 با این کار هر کد جاوااسکریپت که ممکنه درون ورودی وجود داشته باشه از بین میره. در مثال دوم اگر قبل از قرار دادن ورودی کاربر در html اون رو sanitize میکردیم کد درون تگ script اجرا نمیشد. این جادوی sanitize کردنه.این شرایط رو میتونید بسط بدید. مثلا در مثال اول باید اسم دانش آموز رو قبل از وارد کردن به کوئری به نوعی sanitize میکردیم. حتما کتابخونه و روش های خاص خودش رو داره که میتونید با یه سرچ ساده بهشون برسید.راه هایی که هکر میتونه یک کد جاوااسکریپت رو به زور اجرا کنه محدود و تا حدی قابل پیشبینی هست. پس میشه تا حد خیلی زیادی به کتابخونه زیر اعتماد کرد. ( اگر با جاوا اسکریپت سر و کار دارید )کتابخونه DOMPurify یکی از بهترین کتابخونه ها برای sanitize کردن html هست. import DOMPurify from ‘dompurify’;
const clean = DOMPurify.sanitize(dirty);الان میتونید بدون هیچ نگرانی innerHtml رو به متغیر clean تغییر بدید. توصیه میکنم داکیومنت هاش رو دنبال کنید.در ری اکت به جای innerHtml باید از dangerouslySetInnerHTML استفاده کنیم. مشخصه که خطرناک بودن این کار رو نشون میده. امیدوارم این مطلب براتون مفید بوده باشه. اگر اینطور بود حتما لایک کنید تا بقیه راحت تر پیداش کنند. بیشتر هدفم این بود که یه ایده به شما بدم و خودتون دنباله اش رو بگیرید چون راه های خیلی زیادی برای جلوگیری از این حملات وجود داره.شاید از این ها هم خوشتون بیاد: https://vrgl.ir/rIXji https://vrgl.ir/dXU9e همچنین منابع من این ها بودند:https://martinfowler.com/articles/web-security-basics.htmlhttps://carlanderson.xyz/how-websites-get-hacked-a-simple-example-using-xss/https://owasp.org/www-community/attacks/xss/

Author: admin

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *