.Net Core 防御XXS攻击

news/2024/2/21 10:31:01

        网络安全攻击方式有很多种,其中包括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;}}
}

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/1287622.html

相关文章

李宏毅 自然语言处理(Voice Conversion) 笔记

前一章笔记&#xff1a;李宏毅 自然语言处理&#xff08;Speech Recognition&#xff09; 笔记 引入 什么是voice conversion&#xff1f; 输入一段声音&#xff0c;输出另一段声音&#xff0c;我们希望这两端声音&#xff1a;内容一样&#xff0c;其他方面不一样&#xff08…

web component - 使用HTML Templates和Shadow DOM构建现代UI组件

Web Component是一种用于构建可重用的UI组件的技术。它使用标准化的浏览器API&#xff0c;包括Custom Elements、Shadow DOM和HTML Templates来实现组件化开发方式。这些API都是现代浏览器原生支持的&#xff0c;因此不需要引入第三方库或框架即可使用。 在这篇博客中&#xf…

webrtc turn服务器搭建

测试环境ubuntu 22LTS 首先从github上下载源码编译 GitHub - coturn/coturn: coturn TURN server project 用的tag docker/4.6.2-r7 ./configure --prefix /usr/local/coturn make 安装coturn的时候还需要安装一些依赖包 apt-get install pkg-config apt-get install op…

2023.12.31每日一题

LeetCode每日一题 2023年的最后一题 1154.一年中的第几天 1154. 一年中的第几天 - 力扣&#xff08;LeetCode&#xff09; 描述 给你一个字符串 date &#xff0c;按 YYYY-MM-DD 格式表示一个 现行公元纪年法 日期。返回该日期是当年的第几天。 示例 1&#xff1a; 输入&a…

华为OD机试 - 字符串拼接(Java JS Python C)

题目描述 给定 M(0 < M ≤ 30)个字符(a-z),从中取出任意字符(每个字符只能用一次)拼接成长度为 N(0 < N ≤ 5)的字符串, 要求相同的字符不能相邻,计算出给定的字符列表能拼接出多少种满足条件的字符串, 输入非法或者无法拼接出满足条件的字符串则返回0。 …

指定列名自动将Excel内的数据拆分为不同的Sheet(基于Python)

在Python中&#xff0c;可以使用pandas和openpyxl或xlsxwriter库来读取Excel文件、操作数据以及将数据写入新的Excel文件中。以下是一个简单的示例&#xff0c;说明如何读取一个Excel文件&#xff0c;将指定列的数据拆分到独立的sheet中&#xff1a; 首先&#xff0c;确保安装…

使用.Net nanoFramework 驱动ESP32的OLED显示屏

本文介绍如何使用.Net nanoFramework 驱动ESP32的OLED显示屏。我们将会从最基础的部分开始&#xff0c;逐步深入&#xff0c;让你能够理解并实现整个过程。无论你是初学者还是有一定经验的开发者&#xff0c;这篇文章都会对你有所帮助。 1. 硬件准备 1.1 ESP32开发板 这里我们…

HCIA-Datacom题库(自己整理分类的)——OSPF协议多选

ospf的hello报文功能是 邻居发现 同步路由器的LSDB 更新LSA信息 维持邻居关系 下列关于OSPF区域描述正确的是 在配置OSPF区域正确必须给路由器的loopback接配置IP地址 所有的网络都应在区域0中宣告 骨干区域的编号不能为2 区域的编号范围是从0.0.0.0到255.255.255.255…

2023-12-19 LeetCode每日一题(寻找峰值 II)

2023-12-19每日一题 一、题目编号 1901. 寻找峰值 II二、题目链接 点击跳转到题目位置 三、题目描述 一个 2D 网格中的 峰值 是指那些 严格大于 其相邻格子(上、下、左、右)的元素。 给你一个 从 0 开始编号 的 m x n 矩阵 mat &#xff0c;其中任意两个相邻格子的值都 不…

手拉手后端Springboot整合JWT

环境介绍 技术栈 springbootmybatis-plusmysqljava-jwt 软件 版本 mysql 8 IDEA IntelliJ IDEA 2022.2.1 JDK 1.8 Spring Boot 2.7.13 mybatis-plus 3.5.3.2 Json Web令牌简称JWT Token是在服务端产生的一串字符串是客户端访问资源接口(AP)时所需要的资源凭证。…

常见网络设备及功能详解

网络设备 - 交换机 交换机&#xff1a;距离终端用户最近的设备&#xff0c;用于终端用户接入网络、对数据帧进行交换等。 交换机的功能&#xff1a; 终端设备&#xff08;PC、服务器等&#xff09;的网络接入二层交换&#xff08;Layer 2 Switching&#xff09; 网络设备 - …

用UltraISO制作镜像以RAW格式刻录系统到U盘后,在Windows上无法识别的解决办法

用UltraISO制作镜像以RAW格式刻录系统到U盘后&#xff0c;在Windows上无法识别的解决办法&#xff1a; 在https://wtl4it.blog.csdn.net/article/details/135319887https://wtl4it.blog.csdn.net/article/details/135319887 这篇文章中&#xff0c;用UltraISO制作镜像后&…

千里马2023年终总结-android framework实战

背景&#xff1a; hi粉丝朋友们&#xff1a; 2023年马上就过去了&#xff0c;很多学员朋友也都希望马哥这边写个年终总结&#xff0c;因为这几个月时间都忙于新课程halsystracesurfaceflinger专题的开发&#xff0c;差点都忘记了这个事情了&#xff0c;今天特别花时间来写个bl…

C# WPF上位机开发(Web API联调)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 很多时候&#xff0c;客户需要开发的不仅仅是一个上位机系统&#xff0c;它还有其他很多配套的系统或设备&#xff0c;比如物流小车、立库、数字孪…

回顾 2023,展望 2024

by zhengkai.blog.csdn.net 项目与心得 今年最大的项目和心得&#xff0c;非GCP莫属&#xff0c;作为全球顶尖的云平台&#xff0c; GCP有他的优势&#xff0c;也有很多难用的地方。但是作为当时的一个strategic solution&#xff0c;我们的印度本地化项目必须使用GCP&#xf…

[EFI]HP Spectre 13 v102nl电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板 HP Spectre 13 v102nl 处理器Intel Core i7-7500U (7th gen - Kaby Lake)已驱动内存8 GB LPDDR3-1866 SDRAM已驱动硬盘512 GB Toshiba NVMe™ M.2 SSD已驱动显卡Intel HD Graphics 620已驱动声卡Conexant CX8200 (0x2008)已驱动网卡I1211 Gigabit Etherne…

[spark] dataframe的cache方法

在 Apache Spark 中&#xff0c;DataFrame 的 cache 方法用于将 DataFrame 的计算结果缓存到内存中&#xff0c;以便在后续的操作中能够更快地访问这些数据。这对于在多个阶段使用相同的 DataFrame 数据时是非常有用的&#xff0c;可以避免重复计算。 文章目录 cache用法SparkO…

K8S学习指南(52)-k8s包管理工具Helm

文章目录 引言Helm 基本概念Helm 的架构Helm 使用示例1. 安装 Helm2. 初始化 Helm3. 创建一个 Chart4. 编辑 Chart5. 打包 Chart6. 发布 Chart7. 部署 Release Helm 的高级用法1. 使用 Helm Secrets 进行敏感信息加密2. 使用 Helmfile 进行多Chart管理 Helm 的进阶主题1. Helm …

Go语言中的包管理工具之Go Path的使用

GoLang 中常用的包管理的方式 1 &#xff09;概述 常用的有三种 Go PathGo VendorGo Modules 2 &#xff09;发展历程 早期go的包管理存在很大缺陷&#xff0c;甚至可以说没有官方统一的包管理工具 一方面官方在努力发布一些实验性的包管理工具。同时也出现了很多社区开发…

人是需要被肯定和认可的,赞美也是一种动力

前几天转发了一些网上的文章&#xff0c;突然有了10个关注我的人&#xff0c;赞美数和收藏量也上去了一些。 这是一种很意外的惊喜。 看了一下主题是&#xff1a; 1,如何将.NET8创建的控制台程序部署成WINDOWS服务。 2,.NET进阶篇06-async异步、thread多线程 3,易语言启动线程传…
最新文章