最近公司内部在对系统的安全进行培训,恰好目前手里的一个.net core 项目中须要增长预防xss的攻击,本文将大概介绍下何为XSS攻击以及在项目中如何统一的预防XSS攻击.html
XSS 攻击全称为跨站脚本攻击( Cross-site Scripting ),XSS 是一种常见的 web 安全漏洞,它容许攻击者将恶意代码植入到提供给其余用户使用的页面中。XSS 必定是由用户的输入引发的,不管是提交表单、仍是点击连接(参数)的方式,只要是输出的时候不作任何转义和过滤,就有可能出错。前端
—— 维基百科web
XSS 一般分为反射型 XSS 、存储型 XSS 和 DOM based XSS,本文介绍的反射型 XSS ,主要作法是将 Javascript 代码加入 URL 地址的请求参数里,若 Web 应用程序存在漏洞,请求参数会在页面直接输出,用户点击相似的恶意连接就可能遭受攻击。攻击的整个流程以下图:后端
反射型XSS,顾名思义在于“反射”这个一来一回的过程。反射型XSS的触发有后端的参与,而之因此触发XSS是由于后端解析用户在前端输入的带有XSS性质的脚本或者脚本的data URI编码,后端解析用户输入处理后返回给前端,由浏览器解析这段XSS脚本,触发XSS漏洞。所以若是要避免反射性XSS,则必须须要后端的协调,在后端解析前端的数据时首先作相关的字串检测和转义处理;同时前端一样也许针对用户的数据作excape转义,保证数据源的可靠性。
浏览器
存储型则是直接将xss语句插入到网站的正常页面中(一般都是留言板),而后用户只要访问了这些页面,就会自动执行其中的xss语句。安全
经过全局定义一个属性过滤器实行的xss
public static class XSSHelper { /// <summary> /// XSS过滤 /// </summary> /// <param name="html">html代码</param> /// <returns>过滤结果</returns> public static string XssFilter(string html) { string str = HtmlFilter(html); return str; } /// <summary> /// 过滤HTML标记 /// </summary> /// <param name="Htmlstring"></param> /// <returns></returns> public static string HtmlFilter(string Htmlstring) { // 写本身的处理逻辑便可,下面给出一个比较暴力的孤哦旅,把 匹配到<[^>]*>所有过滤掉,建议慎用,只是一个例子 string result = Regex.Replace(Htmlstring, @"<[^>]*>", String.Empty); return result; } }
/// <summary> /// XSS 过滤器 /// </summary> public class XSSFilterAttribute : ActionFilterAttribute { /// <summary> /// OnActionExecuting /// </summary> /// <param name="context"></param> public override void OnActionExecuting(ActionExecutingContext context) { //获取参数集合 var ps = context.ActionDescriptor.Parameters; //遍历参数集合 foreach (var p in ps) { if (context.ActionArguments[p.Name] != null) { //当参数是str if (p.ParameterType.Equals(typeof(string))) { context.ActionArguments[p.Name] = XSSHelper.XssFilter(context.ActionArguments[p.Name].ToString()); } else if (p.ParameterType.IsClass)//当参数是一个实体 { PostModelFieldFilter(p.ParameterType, context.ActionArguments[p.Name]); } } } } /// <summary> /// 遍历实体的字符串属性 /// </summary> /// <param name="type">数据类型</param> /// <param name="obj">对象</param> /// <returns></returns> private object PostModelFieldFilter( Type type, object obj) { if (obj != null) { foreach (var item in type.GetProperties()) { if (item.GetValue(obj) != null) { //当参数是str if (item.PropertyType.Equals(typeof(string))) { string value = item.GetValue(obj).ToString(); item.SetValue(obj, XSSHelper.XssFilter(value)); } else if (item.PropertyType.IsClass)//当参数是一个实体 { item.SetValue(obj, PostModelFieldFilter(item.PropertyType, item.GetValue(obj))); } } } } return obj; } }
在须要进行XSS过滤的控制器或者action上加上对应的属性便可ide
//属性过滤器 [XSSFilt] public class CommonApiController : Controller { }
HtmlFilter
方法本身能够写定义一些规则。网站
有什么更好的处理方式欢迎你们留言交流编码