اخبار، مطالب و رویدادهای مرتبط با توسعه نرم افزار رادکام

محافظت در برابر حملات رایج - قسمت دوم - محافظت در برابر حملات اسکریپت بین سایتی (cross-site scripting).

اسکریپت بین سایتی یا XSS یک آسیب پذیری امنیتی است که در آن اسکریپت های مخرب client-side به صفحه وب شما تزریق می شود. این کد ها معمولاً کدهای جاوا اسکریپت می باشند و هنگامی که اسکریپت ها اجرا می شوند، شخص مهاجم به مرورگر شما دسترسی پیدا می کند. سپس می‌توانند با سرقت کوکی‌ها و توکن های مربوط به Session ها، اعمال تغییر در صفحه وب شما یا هدایت مجدد به صفحه‌ای دیگر باعث آسیب شوند. این مشکل زمانی می تواند اتفاق بیفتد که برنامه شما اطلاعات ورودی کاربر را بپذیرد و سپس آن را بدون هیچ گونه رمزگذاری یا اعتبارسنجی به عنوان خروجی به مرورگر دهد. اسکریپت مخرب می تواند به روش های مختلفی وارد سیستم شما شود. ورودی های فرم HTML مانند یک فیلد متنی می تواند یکی از این منابع باشد.

cross-site-scripting


رشته‌های Query String مرتبط با آدرس های URL و هدرهای HTTP ابزار دیگری برای ورود دیتا هستند و حتی داده‌هایی که از یک پایگاه داده در صورت دستکاری شدن اطلاعات بدست می‌آیند. خوشبختانه، اقداماتی وجود دارد که می توانیم برای محافظت در برابر این حملات انجام دهیم. هر داده غیرقابل اعتمادی که باید در یک صفحه وب HTML قرار داده شود باید رمزگذاری گردد. این برای  هردوی عناصر(Elements) و ویژگی(Attribute) های HTML اعمال می شود. رمزگذاری، کاراکترهای بالقوه ناامن مانند براکت‌ها(< و >) را به شکل ایمن‌تر تبدیل می‌کند. اگر داده‌های غیرقابل اعتمادی را در جاوا اسکریپت قرار می‌دهید تا به صورت پویا کد تولید شود، باید کدگذاری آنها نیز انجام شود. کدگذاری جاوا اسکریپت، کاراکترهای خطرناک را با مقادیر hexadecimal آنها جایگزین می کند.
به همین ترتیب، اگر یک رشته Query String واقع در URL با داده های نامعتبر تولید شود، باید URL مربوطه کدگذاری شده باشد.
این کار همه کاراکترهایی که حرفی و عددی نیستند را تحت تاثیر قرار می دهد. بیایید نحوه پیاده سازی این قوانین را در یک برنامه MVC Core ASP.NET بررسی کنیم. ادامه دهید و پروژه Roux Academy را اجرا کنید و ما به عنوان عضو هیئت علمی وارد سایت می شویم. حالا بیایید یک نمره برای یک دانش آموز اضافه کنیم، اما به جای وارد کردن یک مقدار معتبر برای نام دوره، می خواهیم کد جاوا اسکریپت را برای تقلید از یک حمله اسکریپت بین سایتی وارد کنیم. کاری که این اسکریپت انجام می دهد این است که یک پیام هشدار را هنگام اجرا نشان دهد.

<script>alert("XSS ATACK");</script>

بیایید بقیه فیلدهای فرم را پر کنیم.
و برای نام کاربری دانشجویی، از نام کاربری که قبلا به عنوان دانش آموز ثبت نام کرده بودیم استفاده خواهیم کرد. حالا بیایید به عنوان دانش آموز وارد شویم تا نمره جدید خود را ببینیم. توجه داشته باشید که کد جاوا اسکریپت اجرا نشد. خبر خوب این است که Razor Engine مورد استفاده در MVC به طور خودکار تمام خروجی های مدل ها و متغیرها را کد گذاری می کند. بیایید نگاهی دقیق تر به کد بیندازیم تا ببینیم چگونه کار می کند.
ادامه می دهیم و ویوی Index مربوط به بخش دانشجوها را باز می کنیم. توجه کنید که چگونه از عبارت @ در view برای نمایش خروجی نمرات دوره استفاده می کنیم. این کار به طور خودکار کدگذاری HTML را اعمال می کند.

<h3>@grade.CourseName</h3>
بیایید ویو را تغییر دهیم تا نام دوره را به صورت HTML خام فراخوانی کنیم.

<h3>@Html.Raw(grade.CourseName)</h3>


این خروجی HTML خام بوده و هیچ گونه کد گذاری روی آن انجام نمی شود. حال صفحه را رفرش کنیم. همانطور که مشاهده می کنید کد جاوا اسکریپت وارد شده اجرا می شود و می توانید پیام و باکس هشدار را ببینید. بنابراین در نظر داشته باشید که این تابع کمکی خام HTML فقط باید در صورت لزوم استفاده شود. و فقط با خروجی HTML قابل اعتماد باید فراخوانی گردد.
ممکن است سناریوهایی وجود داشته باشد که در آنها باید داده های خروجی خود را به صورت دستی رمزگذاری کنید، به عنوان مثال اگر به جای متغیرهای MVC با داده های خام درود آبجکت Request کار می کنید. در این حالت می توانید از کلاس رمزگذار HTML استفاده کنید.
بیایید فضای نام  مربوط به رمزگذاری ها را به بالای ویو اضافه کنیم:

@using System.Text.Encodings.Web;

این به ما امکان دسترسی به رمزگذار پیش فرض HTML را می دهد. و سپس می توانیم متد encode را فراخوانی کنیم و رشته ای را که می خواهیم به این صورت رمزگذاری کنیم به عنوان پارامتر به این متد ارسال کنیم.

<h3>@HtmlEncoder.Default.Encode(grade.CourseName)</h3>

کلاس های رمزگذار بیشتری از جمله برای کد های جاوا اسکریپت و آدرس های URL موجود است. برای استفاده از آنها می توانیم رمزگذار HTML را با رمزگذار جاوا اسکریپت جایگزین کنیم یا می توانیم رمزگذار HTML را با رمزگذار URL جایگزین کنیم.
رمزگذارهای پیش فرض همگی از امن ترین قوانین رمزگذاری ممکن استفاده می کنند.
ما همچنین می توانیم از رمزگذارها در کلاس های کنترلر خود با تزریق وابستگی به آنها استفاده کنیم.

دانلود فایل پروژه

نام را وارد کنید
تعداد کاراکتر باقیمانده: 1000
نظر خود را وارد کنید