htmlencode 是防御 xss 的第一道防线,但需在输出 html 前仅编码一次;应避免双重编码、入库前编码或滥用 @html.raw;推荐 .net core 用 htmlencoder.default.encode(),并结合输入白名单校验与上下文编码。

HtmlEncode 是最直接的防御手段,但用错地方等于没防
只要用户输入内容最终会以 HTML 形式渲染到页面上,HttpUtility.HtmlEncode 就是第一道防线。它把 变成 <code><,> 变成 >," 变成 ",让浏览器不再解析为标签或脚本。
但常见错误是:只在 Controller 层 encode 一次,然后存进数据库;后续从 DB 读出再显示时,又重复 encode —— 导致页面显示 <script></script> 这种双重编码的乱码。正确做法是:只在输出到 HTML 响应前 encode,且仅一次。
- 不要在入库前 encode,除非你明确需要存储已编码文本(极少见)
- 不要在 View 中用
@Html.Raw(Model.Message)绕过自动编码,除非你 100% 确认该字段已白名单净化 - ASP.NET MVC 的
@Model.Message默认已做 HTML 编码,无需额外调用HtmlEncode
AntiXssEncoder.HtmlEncode 要比 HttpUtility.HtmlEncode 更严格
AntiXssEncoder.HtmlEncode 来自 Microsoft Web Protection Library(旧版),默认只放行 Unicode 白名单字符,对未识别字符一律编码;而 HttpUtility.HtmlEncode 是 .NET Framework 原生方法,只转义 & " 四个基础字符,其余如 javascript:、onerror= 不处理。
如果你的场景涉及富文本编辑器、评论区、用户可输入样式或链接,AntiXssEncoder 更稳妥。但它在 .NET Core/.NET 5+ 中已不推荐,取而代之的是 System.Text.Encodings.Web 提供的 HtmlEncoder.Default.Encode()。
- .NET Core 3.1+ 推荐用
HtmlEncoder.Default.Encode(input),性能更好,支持自定义安全列表 - 若仍在用 .NET Framework 4.7.2+,
AntiXssEncoder仍可用,但需手动安装Microsoft.AspNet.WebPages包 - 注意:
AntiXssEncoder.HtmlEncode(string, bool)第二个参数控制是否使用命名实体(如&),一般设为false避免兼容性问题
不能只靠输出编码,输入过滤必须分场景做白名单
单纯依赖输出编码,防不住「属性上下文」和「JavaScript 上下文」中的 XSS。比如用户输入被插进 <input value="xxx"> 或 onclick="alert('xxx')",此时 HTML 编码无效,需对应上下文编码。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
更可靠的做法是:对输入字段做最小化白名单校验。例如邮箱字段只允许 [a-z0-9._%+-]+@[a-z0-9.-]+\.[a-z]{2,};用户名限制为字母数字下划线;富文本则必须用成熟库(如 HtmlSanitizer)剥离 script、on\* 事件、javascript: 协议等。
- 别用黑名单正则过滤 XSS,如
@"<script.>"</script.>易被绕过(大小写混淆、注释干扰、Unicode 编码) - 对 URL 类输入,用
Uri.IsWellFormedUriString校验格式,再用UrlEncoder.Default.Encode()编码后输出 - JS 上下文输出(如
var msg = "@Model.Msg";)必须用JavaScriptEncoder.Default.Encode(),否则引号逃逸直接破防
View 中混用 @Model 和 @Html.Raw 是高危操作
ASP.NET MVC 默认对 @Model.Xxx 自动调用 HtmlEncode,但开发者常因“样式失效”“链接不跳转”等问题,擅自改用 @Html.Raw(Model.Xxx)。这是 XSS 最常见的突破口。
一旦用了 @Html.Raw,你就必须确保 Model.Xxx 已经过完整净化——不是简单 replace,而是基于上下文的多层编码或白名单过滤。否则攻击者输入 " onfocus=alert(1) autofocus="" 就能触发执行。
- 除非字段来源完全可控(如后台配置项、枚举描述),否则禁止
@Html.Raw - 若必须支持富文本,用
HtmlSanitizer库处理后再输出,而不是信任前端传来的 HTML 片段 - 检查所有
@Html.Raw调用点,逐个确认其数据流:谁赋值?是否经过Sanitize()?有没有缓存绕过?
真正难防的 XSS 往往不在大块逻辑里,而在某个 @Html.Raw 调用、某次忘记上下文编码的 JS 字符串拼接、或者某条被忽略的富文本入库路径。防御的关键不是堆砌工具,而是让每个输出点都明确回答:这段数据会在什么上下文中被解释?我用了哪种编码?有没有被二次解码?
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










