- 1399/07/20 16:11:06
- 0
جلوگیری از حملات XSS در ASP.NET Core
در ASP.NET Core کار جلوگیری از حملات XSS بر عهده برنامه نویس گذاشته شدهاست و مانند نسخههای قبلی، Request Validation یا اعتبارسنجی درخواستها به صورت توکار در آن وجود ندارد.
- هرچند ASP.NET Core دادهها را هنگام نمایش، encode میکند و عملا بسیاری از حملات خنثی میشوند، اما در صورتیکه بخواهیم دادههای غیر مطمئن، در بانک اطلاعاتی نیز ذخیره نشوند، باید آنها را ارزیابی کنیم. یکی از روشهای مقابلهی با این حملات، تمیز کردن اطلاعات ورودی کاربر است.
برای این کار کافی است یک ActionFilter ایجاد کرده و آن را برای هر اکشنی که داده ورودی دارد فراخوانی کنید. به مثال زیر دقت کنید:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false, Inherited = true)]
public class SanitizeInputAttribute : ActionFilterAttribute
{
var sanitizer = new Ganss.XSS.HtmlSanitizer();
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
if (filterContext.ActionArguments != null)
{
foreach (var parameter in filterContext.ActionArguments)
{
var properties = parameter.Value.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
.Where(x => x.CanRead && x.CanWrite && x.PropertyType == typeof(string) && x.GetGetMethod(true).IsPublic && x.GetSetMethod(true).IsPublic);
foreach (var propertyInfo in properties)
{
if (propertyInfo.GetValue(parameter.Value) != null)
propertyInfo.SetValue(parameter.Value,
sanitizer.Sanitize(propertyInfo.GetValue(parameter.Value).ToString()));
}
}
}
}
}
در این فیلتر، از کتابخانه HtmlSanitizer برای تمیز کردن اطلاعات استفاده کردهایم. ابتدا تمام ورودیهای اکشن متد را خوانده و سپس ورودیهایی را که از نوع string هستند، پیدا کرده و مقدار فعلی آنها را با مقدار sanitize شده، جایگزین میکند. بنابراین اگر در رشتهی ورودی، عبارت یا تگ خطرناک یا غیر مجازی باشد، حذف میگردد.
برای استفاده از این فیلتر کافی است به صورت زیر عمل کنید:
[SanitizeInput]
public IActionResult Add(GroupDto dto)
dotnettips منبع: سایت