You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

检测HTML字符串中的JavaScript以防范XSS,求.NET快速解决方案

嘿,针对你要检测HTML中是否存在JavaScript并抛异常的需求,我得说优先用成熟的.NET库才是稳妥的选择——毕竟HTML这种不规则的标记语言,正则很容易漏判或者误判,安全性根本没保障。下面给你几个靠谱的方案:

推荐的.NET库方案

1. HtmlSanitizer(最推荐,.NET Core/.NET 5+友好)

这个库专门为HTML清理和安全检测设计,支持自定义规则,完全能满足你“检测到JS就抛异常”的需求。它默认会过滤所有危险内容(比如script标签、on*事件属性),你只需要对比清理前后的HTML内容:如果两者不一致,就说明原HTML存在危险内容。

示例代码:

using Ganss.XSS;

var sanitizer = new HtmlSanitizer();
// 可根据需求自定义允许的标签和属性,默认规则已经覆盖大部分安全场景
sanitizer.AllowedTags.AddRange(new[] { "p", "b", "i", "u", "em", "strong" });
sanitizer.AllowedAttributes.AddRange(new[] { "class", "id" });

string inputHtml = "<p onclick='alert(1)'>Test</p><script>evil()</script>";
string sanitizedHtml = sanitizer.Sanitize(inputHtml);

if (inputHtml != sanitizedHtml)
{
    throw new InvalidOperationException("HTML包含危险的JavaScript内容!");
}

2. HtmlAgilityPack + 自定义检测逻辑

如果你需要更细粒度的控制,可以用HtmlAgilityPack解析HTML,手动遍历节点和属性,排查危险标签或属性。这种方式灵活性极高,适合需要自定义检测规则的场景。

示例代码:

using HtmlAgilityPack;

var doc = new HtmlDocument();
doc.LoadHtml(inputHtml);

// 定义需要检测的危险标签集合
var dangerousTags = new HashSet<string> { "script", "iframe", "embed", "object" };
var hasDangerousTags = doc.DocumentNode.Descendants()
    .Any(node => dangerousTags.Contains(node.Name.ToLower()));

// 定义需要检测的危险属性集合(事件属性、javascript:伪协议链接)
var dangerousAttrs = new HashSet<string> { "onclick", "onload", "onmouseover", "onerror" };
var hasDangerousAttrs = doc.DocumentNode.Descendants()
    .SelectMany(node => node.Attributes)
    .Any(attr => dangerousAttrs.Contains(attr.Name.ToLower()) || 
              (attr.Name.ToLower() == "href" && attr.Value.StartsWith("javascript:", StringComparison.OrdinalIgnoreCase)));

if (hasDangerousTags || hasDangerousAttrs)
{
    throw new InvalidOperationException("检测到HTML中存在JavaScript相关的危险内容!");
}

3. 微软AntiXSS库(适用于传统.NET Framework项目)

如果是.NET Framework环境,可以使用System.Web.Security.AntiXss.AntiXssEncoder,通过对比编码前后的内容判断是否存在危险字符。不过这个方法精度稍差,可能会误判一些安全的特殊字符,适合简单场景。

示例代码:

using System.Web.Security.AntiXss;

string encodedHtml = AntiXssEncoder.HtmlEncode(inputHtml, useNamedEntities: true);
if (inputHtml != encodedHtml)
{
    throw new InvalidOperationException("HTML包含潜在的危险内容!");
}
关于正则表达式的注意事项

非常不推荐用正则处理HTML,因为HTML的结构太灵活了——比如注释嵌套、属性值引号混用、大小写混合等情况,正则根本无法覆盖所有场景,很容易被攻击者绕过。举个例子,下面这种变形的script标签,大部分正则都检测不到:

<scr<script>ipt>alert('xss')</scr</script>ipt>

如果非要用正则做初步的粗筛(仅作参考,绝对不能用于生产环境安全检测),可以试试这个示例:

using System.Text.RegularExpressions;

var jsDetectRegex = new Regex(
    @"<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>|on\w+\s*=\s*[""']?[^""'>]+[""']?|javascript:",
    RegexOptions.IgnoreCase | RegexOptions.Multiline);

if (jsDetectRegex.IsMatch(inputHtml))
{
    throw new InvalidOperationException("检测到可能的JavaScript内容!");
}

内容的提问来源于stack exchange,提问作者Andrei

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:27:42