参考地址:https://www.cnblogs.com/sagecheng/p/9462239.html
测试项目:MVCDemo
一、XSS漏洞定义
XSS攻击全称跨站脚本攻击,它允许恶意web用户将代码(如:html代码)植入到页面上,当访问到该页面时,嵌入到页面的html代码会自动执行,从而达到恶意攻击的目的。
二、解决方案
1.新建立一个XSSHelper帮助类
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 = System.Web.HttpUtility.HtmlEncode(Htmlstring);
return result;
}
}
2.再建立一个XSSFilterAttribute过滤类
/// <summary>
/// XSS 过滤器
/// </summary>
public class XSSFilterAttribute : ActionFilterAttribute
{
/// <summary>
/// OnActionExecuting
/// </summary>
/// <param name="context"></param>
public override void OnActionExecuting(ActionExecutingContext context)
{
//获取参数集合
var ps = context.ActionDescriptor.GetParameters();
if (ps.Count() == )
{
return;
}
//遍历参数集合
foreach (var p in ps)
{
if (context.ActionParameters[p.ParameterName] != null)
{
//当参数是str
if (p.ParameterType.Equals(typeof(string)))
{
context.ActionParameters[p.ParameterName] = XSSHelper.XssFilter(context.ActionParameters[p.ParameterName].ToString());
}
else if (p.ParameterType.Equals(typeof(Int64)))
{ }
else if (p.ParameterType.Equals(typeof(Int32)))
{ } else if (p.ParameterType.IsClass)//当参数是一个实体
{
PostModelFieldFilter(p.ParameterType, context.ActionParameters[p.ParameterName]);
}
} }
}
/// <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.Equals(typeof(Int64)))
{ }
else if (item.PropertyType.Equals(typeof(Int32)))
{ }
else if (item.PropertyType.Equals(typeof(Int16)))
{ }
else if (item.PropertyType.IsClass)//当参数是一个实体
{
// item.SetValue(obj, PostModelFieldFilter(item.PropertyType, item.GetValue(obj)));
}
} }
}
return obj;
}
}
3.在控制器上加上该属性,就可对传递过来的参数数值进行过滤(记得要引入对应的命名空间)
说明:为什么要加入[ValidateInput(false)],因为用户如果加入类似<script>的话,直接就报错了,界面不友好,所以就修改为后台对输入的内容进行过滤处理。如果压根不希望用户输入类似的字符,需要也在前端进行一下验证就可以了。