.Net Core 防御XSS攻击

news/2024/4/20 17:13:06/

        网络安全攻击方式有很多种,其中包括XSS攻击、SQL注入攻击、URL篡改等。那么XSS攻击到底是什么?XSS攻击有哪几种类型?

        XSS攻击又称为跨站脚本,XSS的重点不在于跨站点,而是在于脚本的执行。XSS是一种经常出现在Web应用程序中的计算机安全漏洞,是由于Web应用程序对用户的输入过滤不足而产生的,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。

       常见的XSS攻击有三种:反射型XSS攻击、DOM-based型XSS攻击、存储型XSS攻击。

第一种:反射型XSS攻击

        反射型XSS攻击一般是攻击者通过特定手法,诱使用户去访问一个包含恶意代码的URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。此类XSS攻击通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端Cookies或进行钓鱼欺骗

第二种:DOM-based型XSS攻击

        客户端的脚本程序可以动态地检查和修改页面内容,而不依赖于服务器端的数据。例如客户端如从URL中提取数据并在本地执行,如果用户在客户端输入的数据包含了恶意的JavaScript脚本,而这些脚本没有经过适当的过滤或者消毒,那么应用程序就可能受到DOM-based型XSS攻击。

  需要特别注意以下的用户输入源document.URL、location.hash、location.search、document.referrer等。

第三种:存储型XSS攻击

        攻击者事先将恶意代码上传或者储存到漏洞服务器中,只要受害者浏览包含此恶意代码的页面就会执行恶意代码。这意味着只要访问了这个页面的访客,都有可能会执行这段恶意脚本,因此存储型XSS攻击的危害会更大。此类攻击一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

        好了,废话太多,还是直接上代码吧,XXSHelper.cs 工具类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;namespace test.Defender
{public class XSSHelper{//过滤后返回的结果public static string XssFilter(string html){string str = HtmlFilter(html);return str;}//过滤htmlpublic static string HtmlFilter(string Htmlstring){//这里用正则表达式匹配到<[^>]*>全部过滤掉,当然也可以根据自身需求填写string result = Regex.Replace(Htmlstring, @"<[^>]*>", String.Empty);return result;}}
}XXSFilterAttribute.cs过滤器
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;namespace test.Defender
{public class XSSFilterAttribute : ActionFilterAttribute{public override void OnActionExecuting(ActionExecutingContext context){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] = 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){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;}}
}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Threading.Tasks;

namespace test.Defender
{
    public class XSSHelper
    {
        //过滤后返回的结果
        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;
        }
    }
}

XXSFilterAttribute.cs过滤器
using Microsoft.AspNetCore.Mvc.Filters;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace test.Defender
{
    public class XSSFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            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] = 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)
                    {
                        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;
        }
    }
}

LoginController.cs 控制器:

using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using test.Defender;
using test.Jwt;
using test.Models;namespace test.Controllers
{[XSSFilter]   //在控制器加上XXSFilter即可过滤[ApiController][Route("api/[controller]")]public class LoginController : Controller{private string _names = "admin";private string _role = "admin"; //角色,对应实体类的角色,在控制器中确定角色是否允许访问// POST: api/Login[HttpPost]public IActionResult Index([FromBody] LoginModel model){if (_names.Contains(model.Username) && model.Password == "admin"){return Ok(new{access_token = JwtHelper.create_Token(new User(1, model.Username, _role))});}return Unauthorized();}}
}

防范手段
        都说知己知彼方能百战不殆,知道了xss攻击的原理那么防御的方法也就显而易见了。

        首先是过滤:对诸如<script>、<img>、<a>等标签进行过滤。
        其次是编码:像一些常见的符号,如<>在输入的时候要对其进行转换编码,这样做浏览器是不会对该标签进行解释执行的,同时也不影响显示效果。
        最后是限制:通过以上的案例我们不难发现xss攻击要能达成往往需要较长的字符串,因此对于一些可以预期的输入可以通过限制长度强制截断来进行防御。
 

后话

        安全攻防双方的博弈永远都不会停止,也正是这种博弈推进了信息安全的发展。究竟是道高一尺还是魔高一丈很难定论。其实安全问题归根结底还是一个信任的前提。什么输入值得信任?什么输入不值得信任需要特殊处理是安全人员常常要思考的一个问题。

希望本文对你有帮助,感谢您的阅读。


http://www.ppmy.cn/news/1291894.html

相关文章

队栈和hash的经典算法题(算法村第五关白银挑战)

用栈实现队列 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作&#xff08;push、pop、peek、empty&#xff09;&#xff1a; 实现 MyQueue 类&#xff1a; void push(int x) 将元素 x 推…

AI:108-基于深度学习的通信干扰抑制技术研究

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带有在本地跑过的关键代码,详细讲解供…

Java SE 三个基本注解(JDK内置)+四个元注解

使用注解(Annotation)时要在前面加符号&#xff0c;注解可以当作一个修饰符来修饰他支持的修饰的元素 Override - 重写&#xff0c;该注解只能用于方法 Deprecated - 已弃用&#xff0c;用在程序元素上&#xff0c;如某个类上或者某个方法上 SuppressWarnings - 抑制编译器警告…

【Mac】Mac新机配置前端环境教程

1、先安装谷歌浏览器&#xff0c;稳定版 作为一名前端程序员&#xff0c;和浏览器打交道肯定是必不可少的。Chrome&#xff0c;Edge 都有着丰富的扩展资源。你可以下载插件帮助你更好的在工作中调试代码。 React Developer Tools Vue.js devtools GraphQL developer tools 如…

Mac M1 Parallels CentOS7.9 Install Parallels Tools

一、挂载parallels-tools安装包 mkdir /media/cdrom/ mount /dev/cdrom /media/cdrom/ mount: /dev/sr0 写保护&#xff0c;将以只读方式挂载二、GCC升级 yum install -y centos-release-scl yum install -y devtoolset-8-gcc*# 切换当前会话中gcc版本为8 scl enable devtool…

【Filament】加载obj和fbx模型

1 前言 3D 模型的常用格式主要有 obj、fbx、gltf 等&#xff0c;Filament 中的 filamesh.exe 工具可以将 obj、fbx 格式转换为 filamesh 格式&#xff0c;然后再加载显示。对于 gltf 格式模型&#xff0c;可以通过 ModelViewer 加载显示&#xff0c;这不在本文的讨论范围内。 1…

vue-cli使用环境配置文件env

.env # 在所有的环境中被载入 .env.local # 在所有的环境中被载入&#xff0c;但会被 git 忽略 .env.[mode] # 只在指定的模式中被载入 .env.[mode].local # 只在指定的模式中被载入&#xff0c;但会被 git 忽略 1&#xff0c;.env 后缀的文…

表格封装之 useForm 封装

在日常开发中&#xff0c;后端管理系统中增删改查的开发大多是重复机械式的工作&#xff0c;为了减少解放自己的双手&#xff0c;我们可以对这部分工作的内容进行封装。 一般的增删改查页面&#xff0c;由顶部搜索区&#xff0c;中部表格区&#xff0c;底部功能区&#xff08;…

Asp .Net Core系列:基于MySQL的DBHelper帮助类和SQL Server的DBHelper帮助类

文章目录 MySQLDBHelperMSSQLDBHelper MySQLDBHelper app.config中添加配置 <connectionStrings><add name"MySqlConn" connectionString"serverlocalhost;port3306;userroot;password123456;databasedb1;SslModenone"/></connectionStrin…

贪心算法day05

435. 无重叠区间 本题简单一些&#xff0c;估计大家不用想着贪心 &#xff0c;用自己直觉也会有思路。 代码随想录 力扣题目链接(opens new window) 给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 注意: 可以认为区间的终…

vue-动态高亮效果

个人练习&#xff0c;仅供参考 实现如下效果&#xff1a;点击某块&#xff0c;某块变成其他颜色。 具体实现代码&#xff1a; 上边&#xff1a; <template><div><h3 style"color: #f69">动态高亮效果</h3><hr> <!-- 对象 -->…

vue2和vue3 部署打包到线上子目录的区别

文章目录 vue2部署打包到子目录vue3部署打包到子目录nginx 子目录示例 本文是讲解子目录 我提供的代码和配置主要是关于 Vue 2 和 Vue 3 应用如何部署在子目录中。我会为您逐一解释这些内容。 vue2部署打包到子目录 在 Vue 2 中&#xff0c;您需要设置 base 属性来指定应用的…

css学习之路:sass学习基础篇

SCSS 一、动态的样式语言 让CSS有变量的概念css有很多的缺点 语法不够强大&#xff0c;没有变量和合理的样式复用机制&#xff0c;导致难以维护&#xff0c;我们就可以使用动态样式语言&#xff0c;赋予CSS新的特性。常见的动态样式语言 scss/sass&#xff08;scss兼容sass&am…

面试算法76:数组中第k大的数字

题目 请从一个乱序数组中找出第k大的数字。例如&#xff0c;数组[3&#xff0c;1&#xff0c;2&#xff0c;4&#xff0c;5&#xff0c;5&#xff0c;6]中第3大的数字是5。 分析 面试题59中介绍过一种基于最小堆的解法。这种解法的数据位于一个数据流中&#xff0c;不能一次…

深度学习课程实验一浅层神经网络的搭建

一、 实验目的 1、学习如何建立逻辑回归分类器用来识别猫。将引导你逐步了解神经网络的思维方式&#xff0c;同时磨练我们对深度学习的直觉。&#xff08;说明&#xff09;&#xff1a;除非指令中明确要求使用&#xff0c;否则请勿在代码中使用循环&#xff08;for / while&am…

CGAL 多段线(多边形)三角化

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 CGAL对多段线三角化的过程与Easy3D非常类似(Easy3D 基于动态规划的最小化三角剖分),具体原理可以分为以下几个步骤: 1. 定义有效的三角化:有效的三角化满足两个条件:(1)边界和孔的边在三角化中的度数为1,其…

电源管理芯片常见故障有哪些?如何处理这些故障?

电源管理芯片常见故障 电源管理芯片是电子设备的关键器件&#xff0c;负责电能的转换、配电、检测和其他电源管理。在使用过程中&#xff0c;电源芯片也会出现一些故障&#xff0c;常见的故障有&#xff1a; 1. 电源芯片损坏 长时间的使用可能会导致电源管理芯片损坏&#xff0…

【Spring Cloud Gateway】2、Spring Cloud Gateway网关路由规则

Spring Cloud Gateway 创建 Route 对象时&#xff0c; 使用 RoutePredicateFactory 创建 Predicate 对象&#xff0c;Predicate 对象可以赋值给 Route。 Spring Cloud Gateway包含许多内置的Route Predicate Factories。所有这些断言都匹配 HTTP 请求的不同属性。多个 Route P…

PostgreSQL从入门到精通 - 第40讲:数据库不完全恢复

PostgreSQL从小白到专家&#xff0c;是从入门逐渐能力提升的一个系列教程&#xff0c;内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容&#xff0c;希望对热爱PG、学习PG的同学们有帮助&#xff0c;欢迎持续关注CUUG PG技术大讲堂。 第40讲&#…

linux USB 设备基础知识

一个 USB 设备是一个非常复杂的事物, 如同在官方的 USB 文档(可从 http://www.usb.org 中得到)中描述的. 幸运的是, Linux 提供了一个子系统称为 USB 核, 来处理大部分复杂的工作. 这一章描述驱动和 USB 核之间的交互. 图 USB 设备概览 显示了 USB 设备如何包含配置, 接口, 和端…