اندازهی قلم متن
تخمین مدت زمان مطالعهی مطلب:
یک دقیقه
در ASP.NET Core کار جلوگیری از حملات XSS بر عهده برنامه نویس گذاشته شدهاست و مانند نسخههای قبلی، Request Validation یا اعتبارسنجی درخواستها به صورت توکار در آن وجود ندارد. برای اطلاعات بیشتر به این مقاله مراجعه کنید.
در این فیلتر، از کتابخانه HtmlSanitizer برای تمیز کردن اطلاعات استفاده کردهایم. ابتدا تمام ورودیهای اکشن متد را خوانده و سپس ورودیهایی را که از نوع string هستند، پیدا کرده و مقدار فعلی آنها را با مقدار sanitize شده، جایگزین میکند. بنابراین اگر در رشتهی ورودی، عبارت یا تگ خطرناک یا غیر مجازی باشد، حذف میگردد.
هرچند ASP.NET Core دادهها را هنگام نمایش، encode میکند و عملا بسیاری از حملات خنثی میشوند، اما در صورتیکه بخواهیم دادههای غیر مطمئن، در بانک اطلاعاتی نیز ذخیره نشوند، باید آنها را ارزیابی کنیم. یکی از روشهای مقابلهی با این حملات، تمیز کردن اطلاعات ورودی کاربر است. در ادامه به ایجاد یک ActionFilter میپردازیم تا این کار را برای ورودیهای یک Action Method انجام دهد:
[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())); } } } } }
برای استفاده از این فیلتر کافی است به صورت زیر عمل کنیم:
[SanitizeInput] public IActionResult Add(GroupDto dto)