一、前言

最近公司内部在对系统的安全进行培训,刚好目前手里的一个.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
{
/// <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;
}
}

3.2 新建一个过滤器

        /// <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;
}
}

3.3 使用XSSFilterAttribute

在需要进行XSS过滤的控制器或者action上加上对应的属性即可

    //属性过滤器
[XSSFilt]
public class CommonApiController : Controller
{ }

四 、提示

HtmlFilter 方法自己可以写定义一些规则

五 、备注

有什么更好的处理方式欢迎大家留言交流

.Net Core 项目中添加统一的XSS攻击防御过滤器的更多相关文章

  1. 在SpringBoot项目中添加logback的MDC

    在SpringBoot项目中添加logback的MDC     先看下MDC是什么 Mapped Diagnostic Context,用于打LOG时跟踪一个“会话“.一个”事务“.举例,有一个web ...

  2. 006.Adding a controller to a ASP.NET Core MVC app with Visual Studio -- 【在asp.net core mvc 中添加一个控制器】

    Adding a controller to a ASP.NET Core MVC app with Visual Studio 在asp.net core mvc 中添加一个控制器 2017-2-2 ...

  3. 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】

    Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...

  4. 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射

    一.前言 在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据与数据库实体类之间可能 ...

  5. 在 ASP.NET Core 项目中使用 MediatR 实现中介者模式

    一.前言  最近有在看 DDD 的相关资料以及微软的 eShopOnContainers 这个项目中基于 DDD 的架构设计,在 Ordering 这个示例服务中,可以看到各层之间的代码调用与我们之前 ...

  6. 在 ASP.NET Core 项目中使用 npm 管理你的前端组件包

    一.前言 在项目的前端开发中,对于绝大多数的小伙伴来说,当然,也包括我,不可避免的需要在项目中使用到一些第三方的组件包.这时,团队中的小伙伴是选择直接去组件的官网上下载,还是图省事直接在网上搜索,然后 ...

  7. Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作

    Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...

  8. 关于如何正确地在android项目中添加第三方jar包

    在android项目中添加第三方jar包虽然不是一个很复杂的问题,但是确实给很多开发者带来了不小的困扰.我自己就曾经碰到过calss not found exception.error inflati ...

  9. 如何在VUE项目中添加ESLint

    如何在VUE项目中添加ESLint 1. 首先在项目的根目录下 新建 .eslintrc.js文件,其配置规则可以如下:(自己小整理了一份),所有的代码如下: // https://eslint.or ...

随机推荐

  1. ACM计划

    原文 :http://027xbc.blog.163.com/blog/static/128159658201141371343475/ ACM主要是考算法的,主要时间是花在思考算法上,不是花在写程序 ...

  2. Stateful Future Transformation

    As an async programming pattern, Future has been popular with many of our programmers across a wide ...

  3. js怎么实现继承?

    3. js怎么实现继承? 1. 使用原型prototype 这个问题其实之前总结过了……但是面试时候有点忘……主要思想是记得的,但是不会写,还是基础太不牢靠,写的太少了.一开始因为不知道怎么能继承父类 ...

  4. View事件分发

    NOTE: 笔记,碎片式内容 控件 App界面的开主要就是使用View,或者称为控件.View既绘制内容又响应输入,输入事件主要就是触摸事件. ViewTree 控件基类为View,而ViewGrou ...

  5. PostgreSQL查看表、表索引、视图、表结构

    -- 表索引select * from pg_indexes where tablename='person_wechat_label';select * from pg_statio_all_ind ...

  6. 吴恩达机器学习笔记13-正规方程(Normal Equation)

    到目前为止,我们都在使用梯度下降算法,但是对于某些线性回归问题,正规方程方法是更好的解决方案.如: 即: 运用正规方程方法求解参数: 注:对于那些不可逆的矩阵(通常是因为特征之间不独立,如同时包含英尺 ...

  7. 第56节:ArrayList,LinkedList和String

    import java.util.ArrayList; public class Demo{ public static void main(String[] args) throws Excepti ...

  8. springmvc的Controller里实现转发的同时弹出提示对话框

    以前写servlet时就用到这个,但是现在学了springMVC+hibernate后就不知道怎么实现了,后来在网上找了好多,看了好多,最后经过自己实践成功的如下: 1.首先是Controller控制 ...

  9. Python开发之---PyCharm初体验

    PyCharm 的初始设置(知道) 目标 恢复 PyCharm 的初始设置 第一次启动 PyCharm 新建一个 Python 项目 设置 PyCharm 的字体显示 PyCharm 的升级以及其他 ...

  10. iReport官方文档(英文版本)+ iReport中文教程

    背景介绍 最近学习iReport,但是网上找到的博客里都是断断续续,几乎没有很详尽的资料文档,要么下载收费,要么不全.很是困扰. 在此,我提供给大家两个官网文档: JasperReports Libr ...