در این مقاله، در رابطه با Header های امنیتی ASP.NET Core خواهید آموخت.با کمکHeader ها، وبسایت شما میتواند اطلاعات مفیدی را به مرورگر ارسال کند.
بیایید بررسی کنیم چگونه میتوان حفاظت و امنیت بیشتری را به وبسایت خود اضافه کرد.
جهت افزودن یک هدر برای هر درخواست، میتوانیم از میانافزار استفاده کنیم.
XSS و CSP
حملهی XSS-Cross-Site Scripting ، همچنان در IO مورد برتر OWASP قرار دارد.
به طور حتم، در رمزگذاری کردن سمبل ها پیشاز نمایش متن بر روی وبسایت (با استفاده از هر یک از HtmlEncoder، JavaScriptEncoder، و UrlEncoder) بسیار کمککننده است. و بهتر است هیچگاه از @Html.Raw() استفاده نشود.
اما امکان افزودن هدری که مرورگر را جهت متوقف کردن حملهی XSS آگاه کند، وجود دارد.
این نوع هدر اغلب برای مرورگرهای قدیمی کاربرد دارد.
app.Use(async (context, next) => { context.Response.Headers.Add("X-Xss-Protection", "1"); await next(); });
برای مرورگرهای جدید، بهتر است از CSP استفاده کرد. در اینجا نحوهی افزودن هدر CSP آورده شده است.
app.Use(async (context, next) => { context.Response.Headers.Add( "Content-Security-Policy", "default-src 'self'; " + "img-src 'self' myblobacc.blob.core.windows.net; " + "font-src 'self'; " + "style-src 'self'; " + "script-src 'self' 'nonce-KIBdfgEKjb34ueiw567bfkshbvfi4KhtIUE3IWF' "+ " 'nonce-rewgljnOIBU3iu2btli4tbllwwe'; " + "frame-src 'self';"+ "connect-src 'self';"); await next(); });
در این مثال، امکان اجرای فایلهای script.js تنها از وبسایت فعلی (که معنایی از ‘ self’ است) وجود دارد؛ و امکان اجرای ۲ اسکریپت مشخصشده با صفت ” nonce ” که در صفحه داخل تگ script درج شدهاند وجود دارد.
برای مثال، اگر از اسکریپتی مانند این داخل صفحهی خود استفاده میکنید.
آنگاه، قادر نخواهید بود این اسکریپت را بدون افزودن ‘ unsafe-inline ’ به تعریف CSP خود اجرا کنید.
اما افزودن ” unsafe-inline ” به معنای رهاکردن وبسایت خود بدون حفاظت است.
بنابراین، بهتر است اسکریپتی را به داخل فایل .js منتقل کرده یا از لینک nonce استفاده کنید.
تنها صفت nonce را با مقداری تصادفی به اسکریپت خود اضافه کنید.
برای مثال:
سپس میتوانید مقدار ‘ nonce-KUY8VewuvyUYVEIvEFue4vwyiuf ’ را به اسکریپت CSP خود اضافه کنید و قادر خواهید بود اسکریپتهایی از دقیقا این بخش <script> را اجرا کنید.
‘ unsafe-inline ’ نیز مربوط به رویدادهایی است که به عنوان صفت به html شما اضافه میشوند.
مانند onclick، onchange، onkeydown، onfocus.
برای مثال، به جای رویداد onclick زیر، باید شناسه یا کلاس را به عنصر خود اضافه کنید و رویداد را از <script> یا فایل .js فراخوانی کنید.
به این صورت:
X-Frame-Option
بطور پیشفرض، امکان نمایش وبسایت خود درون یک iframe وجود دارد.
اما با یک هدر کوچک، میتوان از این امر جلوگیری کرد. چرا؟
زیرا یک نفر میتواند وبسایت شما را درون یک فریم نمایش داده و یک لایهی شفاف بر روی آن بگذارد؛ و کاربران تصور میکنند که بر روی لینکهای وبسایت شما کلیک میکنند اما در حقیقت، بر روی آیتمهایی که درون لایهی شفاف قرار داده شدهاند کلیک میکنند.
و از آنجایی که ممکن است کوکیها همچنان در مرورگر کاربر باشند، برخی اعمال میتوانند احراز هویت شوند.
این نوع حمله Clickjacking نامیده میشود؛ و در اینجا هدری برای محافظت از وبسایت شما در برابر این حمله آورده شدهاست.
context.Response.Headers.Add("X-Frame-Options", "DENY");
Content sniffing
در لینک File Upload XSS ، میتوانید مثالی کم و بیش تازه از چگونگی تزریق JavaScript درون یک فایل svg بیابید، و اگر فایلی به این شکل در سروری که امنیت شنود محتوای آن فعال است قرار داده شود، آنگاه JavaScript کار نخواهد کرد، چرا که افزونهی svg با محتوای JS مطابقت نمیکند.
امیدوارم اکنون این حرف من، که هدر بعدی مورد نیاز است، را باور کنید.
context.Response.Headers.Add("X-Content-Type-Options", "nosniff");
Referrer-Policy
یکی از هدرهایی که بصورت خودکار توسط مرورگر افزوده میشود، ” Referrer ” است.
این هدر حاوی سایتی است که کاربر از آن منتقل شدهاست.
گاهی اوقات، این امر برای تجزیه و تحلیل مناسب است. اما گاهی، URL ممکن است حاوی برخی اطلاعات خصوصی باشد که بهتر است فاش نشود.
برای مثال، چه کسی به مقالهای که یک کاربر قبلا تصحیحکرده اهمیت میدهد: http://www.somegoodsite.com/Edit?id=34543276654
اگر نمیخواهید به مرورگرها اجازه دهید که وبسایت شما را به عنوان آخرین بازدید شده در هدر ” Referrer ” نمایش دهند، لطفا از Referrer-Policy:no-referrer استفاده کنید.
در اینجا مثالی از تمامی Header ها در یک میانافزار آورده شده است.
app.Use(async (context, next) => { context.Response.Headers.Add("X-Xss-Protection", "1"); context.Response.Headers.Add("X-Frame-Options", "DENY"); context.Response.Headers.Add("Referrer-Policy", "no-referrer"); context.Response.Headers.Add("X-Content-Type-Options", "nosniff"); context.Response.Headers.Add( "Content-Security-Policy", "default-src 'self'; " + "img-src 'self' myblobacc.blob.core.windows.net; " + "font-src 'self'; " + "style-src 'self'; " + "script-src 'self' 'nonce-KIBdfgEKjb34ueiw567bfkshbvfi4KhtIUE3IWF' "+ " 'nonce-rewgljnOIBU3iu2btli4tbllwwe'; " + "frame-src 'self';"+ "connect-src 'self';"); await next(); });
البته، میتوانید اطلاعاتی را در رابطه با هر یک از این هدرها مطالعه کرده و مقادیر آنها را بر حسب نیاز خود به مقداری مناسبتر تغییر دهید.
Strict-Transport-Security
جهت فعالکردن Strict-Transport-Security مکانیزم اصل امنیتی وب که به حفاظت از وبسایت شما از حملات تنزل پروتکل و ربودن کوکی کمک میکند، مورد بعدی را به خط لولهی میانافزار خود اضافه کنید (یا آن را حذف نکنید)،
app.UseHsts();
این میانافزار، هدر “Strict-Transport-Security” را اضافه خواهد کرد.
Removing Server Header
برخی مواقع، Header ها برخی اطلاعاتی را ارائه میدهند که بهتر است پنهان بمانند.
جهت غیرفعالکردن هدر Server از Kestrel، نیاز است AddServerHeader را بر روی false تنظیم کنید.
اگر نسخهی ASP.NET Core شما پایینتر از ۲.۲ است از UseKestrel() استفاده کنید و در غیر اینصورت از ConfigureKestrel() استفاده کنید.
WebHost.CreateDefaultBuilder(args) .UseKestrel(c => c.AddServerHeader = false) .UseStartup<Startup>() .Build();
هیچ دیدگاهی نوشته نشده است.