.net core xss攻击防御
XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。
比如我们在表单提交的时候插入脚本代码
如果不进行处理,那么就是这种效果,我这里只是演示一个简单的弹窗
下面给大家分享一下我的解决方案。
需要用到这个库:HtmlSanitizer
https://github.com/mganss/HtmlSanitizer
新建一个过滤类。
public class XSS
{
private HtmlSanitizer sanitizer;
public XSS()
{
sanitizer = new HtmlSanitizer();
//sanitizer.AllowedTags.Add("div");//标签白名单
sanitizer.AllowedAttributes.Add("class");//标签属性白名单,默认没有class标签属性
//sanitizer.AllowedCssProperties.Add("font-family");//CSS属性白名单
} /// <summary>
/// XSS过滤
/// </summary>
/// <param name="html">html代码</param>
/// <returns>过滤结果</returns>
public string Filter(string html)
{
string str = sanitizer.Sanitize(html);
return str;
}
}
新建一个过滤器
public class FieldFilterAttribute : Attribute,IActionFilter
{
private XSS xss;
public FieldFilterAttribute()
{
xss = new XSS();
} //在Action方法之回之后调用
public void OnActionExecuted(ActionExecutedContext context)
{ } //在调用Action方法之前调用
public void OnActionExecuting(ActionExecutingContext context)
{
//获取Action参数集合
var ps = context.ActionDescriptor.Parameters;
//遍历参数集合
foreach (var p in ps)
{
if (context.ActionArguments[p.Name] != null)
{
//当参数等于字符串
if (p.ParameterType.Equals(typeof(string)))
{
context.ActionArguments[p.Name] = xss.Filter(context.ActionArguments[p.Name].ToString());
}
else if (p.ParameterType.IsClass)//当参数等于类
{
ModelFieldFilter(p.Name, p.ParameterType, context.ActionArguments[p.Name]);
}
} }
} /// <summary>
/// 遍历修改类的字符串属性
/// </summary>
/// <param name="key">类名</param>
/// <param name="t">数据类型</param>
/// <param name="obj">对象</param>
/// <returns></returns>
private object ModelFieldFilter(string key, Type t, object obj)
{
//获取类的属性集合
//var ats = t.GetCustomAttributes(typeof(FieldFilterAttribute), false); if (obj != null)
{
//获取类的属性集合
var pps = t.GetProperties(); foreach (var pp in pps)
{
if(pp.GetValue(obj) != null)
{
//当属性等于字符串
if (pp.PropertyType.Equals(typeof(string)))
{
string value = pp.GetValue(obj).ToString();
pp.SetValue(obj, xss.Filter(value));
}
else if (pp.PropertyType.IsClass)//当属性等于类进行递归
{
pp.SetValue(obj, ModelFieldFilter(pp.Name, pp.PropertyType, pp.GetValue(obj)));
}
} }
} return obj;
}
}
//属性过滤器
[FieldFilter]
public class NoteBookController : ManageController
{
//笔记操作接口
private INoteBookAppService _noteBookApp;
public NoteBookController(INoteBookAppService noteBookApp)
{
this._noteBookApp = noteBookApp;
}
public IActionResult Tab()
{
return View();
} }
然后在需要过滤的控制器加上过滤控制器特性就可以了。这样所有string类型的参数就都会进行过滤了。如果不需要对整个控制器进行过滤,只需要在相应的Action加上特性。
最后 点个赞吧。
.net core xss攻击防御的更多相关文章
- XSS攻击防御篇
前言 上篇文章中提到了 XSS 攻击,而且,也从几个方面介绍了 XSS 攻击带来的严重影响.那么,这篇文章中,主要是针对 XSS 攻击做一个基本的防御,看看可以通过几种方式来修复这个特别常见的安全 ...
- .Net Core 项目中添加统一的XSS攻击防御过滤器
一.前言 最近公司内部在对系统的安全进行培训,刚好目前手里的一个.net core 项目中需要增加预防xss的攻击,本文将大概介绍下何为XSS攻击以及在项目中如何统一的预防XSS攻击. 二.XSS简介 ...
- MVC WEB安全——XSS攻击防御
XSS(跨站脚本攻击) 描述: 原理:攻击者往Web页面里插入恶意代码,当用户浏览该页之时,嵌入其中Web里面的代码会被执行,从而达到攻击用户的特殊目的. 类别: 1)被动注入(Passive Inj ...
- XSS 攻击实验 & 防御方案
XSS 攻击&防御实验 不要觉得你的网站很安全,实际上每个网站或多或少都存在漏洞,其中xss/csrf是最常见的漏洞,也是最容易被开发者忽略的漏洞,一不小心就要被黑 下面以一个用户列表页面来演 ...
- 前端XSS攻击和防御
xss跨站脚本攻击(Cross Site Scripting),是一种经常出现在web应用中的计算机安全漏洞,指攻击者在网页中嵌入客户端脚本(例如JavaScript), 当用户浏览此网页时,脚本就会 ...
- Jsoup代码解读之六-防御XSS攻击
Jsoup代码解读之八-防御XSS攻击 防御XSS攻击的一般原理 cleaner是Jsoup的重要功能之一,我们常用它来进行富文本输入中的XSS防御. 我们知道,XSS攻击的一般方式是,通过在页面输入 ...
- 关于Web安全的那些事(XSS攻击)
概述 XSS攻击是Web攻击中最常见的攻击方法之一,它是通过对网页注入可执行代码且成功地被浏览器执行,达到攻击的目的,形成了一次有效XSS攻击,一旦攻击成功,它可以获取用户的联系人列表,然后向联系人发 ...
- web 安全问题(二):XSS攻击
上文说完了CSRF攻击,本文继续研究它的兄弟XSS攻击. 什么是XSS攻击 XSS攻击的原理 XSS攻击的方法 XSS攻击防御的手段 什么是XSS攻击 XSS攻击全名(Cross-Site-Scrip ...
- 155.XSS攻击原理
XSS攻击: XSS(Cross Site Script)攻击叫做跨站脚本攻击,他的原理是用户使用具有XSS漏洞的网站的时候,向这个网站提交一些恶意代码,当用户在访问这个网站的某个页面的时候,这个恶意 ...
随机推荐
- linux中一些简便的命令之cut
提中的这些命令都是些小命令,很简便,在工作过程中经常使用,具体使用方法如下: cut 使用说明:一般是把某个整齐的文档输出其中某列使用 常用的参数有: -f 选择打印的列 -d 指定定界符(默认定界符 ...
- Android中Enum(枚举)的使用
简介 enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性,存放在 java.lang 包中. 创建枚举类型要使用 enum 关键字,隐含了所创建的类型都是 java.l ...
- eclipse svn 忽略 target目录
这个build失败的解决方案就是不要把你项目的 target目录放在src repository 里面,还有 .project 和 .classpath最好也别放到src repository 里. ...
- 一文了解JAVA虚拟机的重要组成
JVM是JAVA平台的重要组成之一,因涉及知识点太多,故从以下几个方面对JVM进行浅层面的介绍,如果需要深入理解,推荐学习机械工业出版社的<深入理解JAVA虚拟机>. 请尊重作者劳动成果, ...
- 以ActiveMQ为例JAVA消息中间件学习【3】——SpringBoot中使用ActiveMQ
前言 首先我们在java环境中使用了ActiveMQ,然后我们又在Spring中使用了ActiveMQ 本来这样已经可以了,但是最近SpringBoot也来了.所以在其中也需要使用试试. 可以提前透露 ...
- 在centos上使用yum安装rabbitmq-server
rabbitmq及其依赖环境 rabbitmq安装之前需要安装socat,否则直接安装rabbitmq可能会报错 如果没有找到,则先安装epel源 yum -y install epel-releas ...
- JVM笔记10-性能优化之高级特性
一.垃圾回收器配置和 GC 日志分析 1.堆典型配置: 32位的操作系统限制堆大小介于1.5G到2G,64位操作系统无限制,同时系统可用虚拟内存和可用物理内存都会限制最大堆的配置. 堆空间分配典型配置 ...
- C语言第六讲,数组
C语言第六讲,数组 一丶什么是数组 数组,就是一整块的连续内存空间. 且类型都是一样的.大小一样 比如: 1.1数组元素的访问 我们要访问数组,例如上面,我们访问元算2,元素3等等怎么访问.. 比如有 ...
- git使用教程PDF版
git是作为一名程序员出新手村的必备技能,所以一定要点亮这个技能 下面是git秘籍:链接:https://pan.baidu.com/s/1slcBStB 密码:wqxk 当然了,在线学习的话,廖雪峰 ...
- break与continue,return结束循环区别
break是跳出一层循环,continue是结束一趟循环 ,return才是结束所有层循环! 如果有多层for循环,break会跳出当前这一层,去执行最外层循环(而不是退出所有层循环);而contin ...