检测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
相关产品推荐
相关产品推荐

