一、前言
最近公司内部在对系统的安全进行培训,刚好目前手里的一个.net core 项目中需要增加预防xss的攻击,本文将大概介绍下何为XSS攻击以及在项目中如何统一的预防XSS攻击.
二、XSS简介
XSS 攻击全称为跨站脚本攻击( Cross-site Scripting ),XSS 是一种常见的 web 安全漏洞,它允许攻击者将恶意代码植入到提供给其他用户使用的页面中。XSS 一定是由用户的输入引起的,无论是提交表单、还是点击链接(参数)的方式,只要是输出的时候不做任何转义和过滤,就有可能出错。
—— 维基百科
XSS 通常分为反射型 XSS 、存储型 XSS 和 DOM based XSS,本文介绍的反射型 XSS ,主要做法是将 Javascript 代码加入 URL 地址的请求参数里,若 Web 应用程序存在漏洞,请求参数会在页面直接输出,用户点击类似的恶意链接就可能遭受攻击。攻击的整个流程如下图:
2.1 反射型XSS
反射型XSS,顾名思义在于“反射”这个一来一回的过程。反射型XSS的触发有后端的参与,而之所以触发XSS是因为后端解析用户在前端输入的带有XSS性质的脚本或者脚本的data URI编码,后端解析用户输入处理后返回给前端,由浏览器解析这段XSS脚本,触发XSS漏洞。因此如果要避免反射性XSS,则必须需要后端的协调,在后端解析前端的数据时首先做相关的字串检测和转义处理;同时前端同样也许针对用户的数据做excape转义,保证数据源的可靠性。
2.2 存储型XSS
存储型则是直接将xss语句插入到网站的正常页面中(通常都是留言板),然后用户只要访问了这些页面,就会自动执行其中的xss语句。
三、实现
通过全局定义一个属性过滤器实行的
3.1 首先新建一个Xss处理的帮助累
public static class XSSHelper
{
///
/// XSS过滤
///
/// html代码
/// 过滤结果
public static string XssFilter(string html)
{
string str = HtmlFilter(html);
return str;
}
///
/// 过滤HTML标记
///
///
///
public static string HtmlFilter(string Htmlstring)
{
// 写自己的处理逻辑即可,下面给出一个比较暴力的孤哦旅,把 匹配到<[^>]*>全部过滤掉,建议慎用,只是一个例子
string result = Regex.Replace(Htmlstring, @"<[^>]*>", String.Empty);
return result;
}
}
3.2 新建一个过滤器
///
/// XSS 过滤器
///
public class XSSFilterAttribute : ActionFilterAttribute
{
///
/// OnActionExecuting
///
///
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]);
}
}
}
}
///
/// 遍历实体的字符串属性
///
/// 数据类型
/// 对象
///
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;
}
}
3.3 使用XSSFilterAttribute
在需要进行XSS过滤的控制器或者action上加上对应的属性即可
//属性过滤器
[XSSFilt]
public class CommonApiController : Controller
{
}
四 、提示
HtmlFilter
方法自己可以写定义一些规则。
五 、备注
有什么更好的处理方式欢迎大家留言交流