.Net Core 项目中添加统一的XSS攻击防御过滤器

时间:2022-02-05 07:37:32

.Net Core 项目中添加统一的XSS攻击防御过滤器

一、前言

最近公司内部在对系统的安全进行培训,刚好目前手里的一个.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转义,保证数据源的可靠性。

.Net Core 项目中添加统一的XSS攻击防御过滤器

2.2 存储型XSS

存储型则是直接将xss语句插入到网站的正常页面中(通常都是留言板),然后用户只要访问了这些页面,就会自动执行其中的xss语句。

.Net Core 项目中添加统一的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&period;Adding a controller to a ASP&period;NET Core MVC app with Visual Studio -- 【在asp&period;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&period;Adding a model to an ASP&period;NET Core MVC app --【在 asp&period;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&period;NET Core 项目中使用 AutoMapper 进行实体映射

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

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

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

  6. 在 ASP&period;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. 最短路 dijkstra and floyd

    二:最短路算法分析报告 背景 最短路问题(short-path problem):若网络中的每条边都有一个数值(长度.成本.时间等),则找出两节点(通常是源节点和阱节点)之间总权和最小的路径就是最短路 ...

  2. openStack 性能开测-2

  3. JavaScript电话号码正则

    var telNumRE = /^((\d{11})|(\d{3,4}-)*(\d{7,8})+(-\d{1,4})*|(\d{5}))$/; 可以截取以下内容: 11位手机号:18911931207 ...

  4. pick off your glasses

    我一直在想,为什么带眼镜时间长了机不愿意再摘下来呢,或者说摘下来感觉很不舒服.当然了,这更多的是内心里的一种感觉而已. 其实,我突然认为这是一种不自信,在这样一个物欲横流的社会中,当你眼前模模糊糊,而 ...

  5. JS遍历数组的操作(map、forEach、filter等)

    1.map的用法 定义:原数组被“映射”成对应新数组 代码示例: var users = [ {name: "张含韵", "email": "zhan ...

  6. C&plus;&plus; std&colon;&colon;pair的用法

    1 pair的应用 pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存.另一个应用是,当一个函数需要返回2个数据的时候, ...

  7. 【软件分析与挖掘】ELBlocker&colon; Predicting blocking bugs with ensemble imbalance learning

    摘要: 提出一种方法——ELBlocker,用于自动检测出Blocking Bugs(prevent other bugs from being fixed). 难度在于这些Blocking Bugs仅 ...

  8. &lbrack;shell&rsqb;shell脚本传入不固定参数的写法,如--help等

    最近在调试一个wifi模块,需要传一些不固定的参数,一下一个参数解析的函数可以搞定这个事情,里面内容好多部分是从一个example中剽窃而来(窃喜) #!/bin/bash # writen by a ...

  9. bzoj1997

    题解: 在圆上面的点能不能不交叉 和那一题差不多 http://www.cnblogs.com/xuanyiming/p/8110597.html 代码: #include<bits/stdc+ ...

  10. android studio - 修改logcat颜色字体

     修改logcat 颜色 (1) 在Android Studio 菜单栏 打开 Preferences -> Editer -> Colors & Fonts -> Andr ...