首页 > 其他分享 >.NET中使用HtmlSanitizer来有效的防范XSS攻击!

.NET中使用HtmlSanitizer来有效的防范XSS攻击!

时间:2024-01-13 10:11:07浏览次数:35  
标签:XSS 标签 sanitizer HtmlSanitizer HTML NET 属性

0X00 前言

随着互联网的发展,网络安全问题越来越受到关注。XSS攻击作为最常见的网络安全漏洞之一,对企业和用户的信息安全构成严重威胁。.NET开发人员可以使用HtmlSanitizer来有效防范XSS攻击,确保网站的安全性。

HtmlSanitizer是一个.NET开源库,用于从可能导致XSS攻击的构造中清除HTML片段和文档。 它使用AngleSharp来解析,操作和渲染HTML和CSS。从而避免标签中毒,即一个片段中的无效 HTML 可能会损坏整个文档,从而导致布局或样式损坏。

HtmlSanitizer可以通过以下方式进行定制:

  • 通过属性配置允许的 HTML 标记。所有其他标签将被剥离。AllowedTags
  • 通过属性 配置允许的 HTML 属性。所有其他属性将被剥离。AllowedAttributes
  • 通过属性 配置允许的 CSS 属性名称。所有其他样式将被剥离。AllowedCssProperties
  • 通过属性 配置允许的 CSS 规则。所有其他规则将被剥离。AllowedAtRules
  • 通过属性配置允许的 URI 方案。所有其他 URI 将被剥离。AllowedSchemes
  • 通过属性配置包含 URI(如“src”、“href”等)的 HTML 属性。UriAttributes
  • 提供将用于解析相对 URI 的基本 URI。
  • 在删除标记、属性或样式之前,会引发可取消的事件。

0x01 使用方法

1、安装 HtmlSanitizer NuGet 包

NuGet\Install-Package HtmlSanitizer -Version 8.0.645
//或
dotnet add package HtmlSanitizer --version 8.0.645

2、基本使用

using Ganss.XSS;
var sanitizer = new HtmlSanitizer();  
sanitizer.AllowTags("a", "em", "strong");  
sanitizer.AllowAttributes("href").OnElements("a");  
sanitizer.AllowUnsafeRaw().OnElements("em", "strong");

以上代码允许保留<a><em><strong>标签,并允许href属性在<a>标签中使用,同时允许保留未经过滤的文本在<em><strong>标签中使用。

3、输出显示
假设输入内容为<script>alert('xss');</script><strong>Some text</strong>,使用HtmlSanitizer进行清洗、过滤

using Ganss.XSS;
// 创建一个HtmlSanitizer实例
var sanitizer = new HtmlSanitizer();

// 配置允许的标签、属性等(可选)
sanitizer.AllowedTags.Add("strong");
sanitizer.AllowedTags.Add("em");
sanitizer.AllowedTags.Add("u");

// 清理HTML内容
string inputHtml = "<script>alert('xss');</script><strong>Some text</strong>";
string sanitizedHtml = sanitizer.Sanitize(inputHtml);

这段代码使用AllowedTags属性配置了允许的HTML标签。在这个例子中,<strong><em><u>标签被允许。而潜在的危险脚本<script>alert('xss');</script>将被删除。
最后可以在Razor页面中使用Html.Raw方法输出清理后的HTML内容:

@Html.Raw(sanitizedHtml)

再看一个例子:

using Ganss.XSS;
var sanitizer = new HtmlSanitizer();
var html = @"<script>alert('xss')</script><div onl oad=""alert('xss')"""
    + @"style=""background-color: test"">Test<img src=""test.gif"""
    + @"style=""background-image: url(javascript:alert('xss')); margin: 10px""></div>";
var sanitized = sanitizer.Sanitize(html, "http://www.example.com");
Console.WriteLine(sanitized);

代码中,定义了一个包含多个HTML危险的字符串html。该字符串包含<script><div><img>等标签,其中包含了一些可能会执行恶意代码的属性。尤其注意<div onl oad=""alert('xss')""" 。然后使用Sanitize方法清理HTML字符串并返回安全的内容sanitized。在这个例子中,清理后的内容仍然包含原始的HTML标记,但是所有潜在的危险代码都被删除了。
输出的内容为:

<div>Test<img src="http://www.example.com/test.gif" style="margin: 10px"></div>

更多的用法,可以到HtmlSanitizer的案例页面进行查看。
最后,附上HtmlSanitizer的开源地址:https://github.com/mganss/HtmlSanitizer

标签:XSS,标签,sanitizer,HtmlSanitizer,HTML,NET,属性
From: https://www.cnblogs.com/gmval/p/17962060

相关文章

  • Windows 10 中,可以使用 PowerShell 添加打印和文件服务的角色功能组件,包括 Internet
    在Windows10中,可以使用PowerShell添加打印和文件服务的角色功能组件,包括Internet打印客户端、LPD打印服务和LPR端口监视器。以下是添加这些功能组件的PowerShell命令:首先,以管理员身份打开PowerShell终端。在开始菜单中搜索"PowerShell",然后右键点击"WindowsPo......
  • Interconnection Network
    bisectionbandwidth"Bisectionbandwidth"是指在一个网络中,沿着网络中间(沿着网络的中轴线)切割(bisection)整个网络时,两侧的带宽之和。这个概念通常用于评估网络的性能和容量。具体而言,如果你想象一个网络是由节点和连接线组成的拓扑结构,而bisectionbandwidth则是通过沿着网络......
  • Asp .Net Core 系列: 集成 Consul 实现 服务注册与健康检查
    目录什么是Consul?安装和运行ConsulAsp.NetCore如何集成Consul实现服务注册和健康检查Consul.AspNetCore中的AddConsul和AddConsulServiceRegistration方法究竟做了什么?AddConsul方法AddConsulServiceRegistration方法配置Consul检查服务封装成扩展效果什么是C......
  • 关于对Spring、Spring MVC、Spring Boot、MyBatis和Netty这几个常用框架的探索
    大家好,我是咕噜美乐蒂,又和大家见面啦!今天我们来探索一下以下内容吧。Java作为一种广泛应用于企业级开发的编程语言,拥有众多优秀的框架来支持开发人员构建高效、可扩展和可维护的应用程序。在这些框架中,Spring、SpringMVC、SpringBoot、MyBatis和Netty可以说是最常用且备受推崇的......
  • Kubernetes 资源强制删除方法总结
    本文适用于K8s及K8s为核心的所有集群。引言在使用K8s时,有时候会遇到资源无法删除问题,就需要一些强制删除的手段。注:强制删除不应随意使用,尤其是在生产环境。注:本文只注重暴力美学,不对任何强制删除导致的后果负责。警告:以下操作均可能会导致数据丢失或集群崩溃,请勿在生产环境尝......
  • 力控元申ThingNet物联中枢平台中的“物模型”
    在万物互联的时代,需要对接不同厂商的设备,由于缺乏统一标准,协议开发重复且难以规模化。海量设备数据解析困难,缺乏结构化处理,使得数据价值难以挖掘。物联网产业链内部复杂,包括模组、芯片、平台和方案商等多个角色,跨角色协作时数据标准不一,导致协作困难。因此,物模型的出现为物联网领域......
  • 当创建一个service后,kubernetes会发生什么?
    本文分享自华为云社区《当创建一个service后,kubernetes会发生什么?》,作者:可以交个朋友。一、Service介绍1.1Kubernetes为什么会引入service?考虑到集群中Pod实例IP地址随着工作负载的生命周期的变化,常规通过访问Pod实例的IP方法变得不再实用。每个工作负载通常有一个或者更多个后端......
  • include <linux/ipv6.h> include <netinet/in.h>
    redefinitionof`structin6_addr'的解决办法 #make[0%]BuilttargetGENHDR[0%]BuildingCobjectlib/CMakeFiles/websockets.dir/plat/unix/unix-sockets.c.oInfileincludedfrom/root/mylib/libwebsockets/lib/plat/unix/unix-sockets.c:31:0:/usr/include/......
  • 4.k8s-配置网络策略 NetworkPolicy
    一、基本了解官方文档:https://kubernetes.io/zh-cn/docs/concepts/services-networking/network-policies/基本了解:1.网络策略通过网络插件来实现,创建一个NetworkPolicy资源对象而没有控制器来使它生效的话,是没有任何作用的,而我们搭建K8s集群时安装的calico网络组件就支持网......
  • 创建service后,kubernetes会发生什么
    本文分享自华为云社区《当创建一个service后,kubernetes会发生什么?》,作者:可以交个朋友。一、Service介绍1.1Kubernetes为什么会引入service?考虑到集群中Pod实例IP地址随着工作负载的生命周期的变化,常规通过访问Pod实例的IP方法变得不再实用。每个工作负载通常有一个或者更多......