
在 ASP.NET Core MVC 中,默认会对 Razor 视图中的表达式进行 HTML 编码以防止 XSS 攻击;若需显示数据库中存储的合法 HTML(如富文本编辑器内容),应使用 HtmlString 或 @Html.Raw() 显式绕过编码,但必须确保内容可信。
在 asp.net core mvc 中,默认会对 razor 视图中的表达式进行 html 编码以防止 xss 攻击;若需显示数据库中存储的合法 html(如富文本编辑器内容),应使用 htmlstring 或 @html.raw() 显式绕过编码,但必须确保内容可信。
ASP.NET Core MVC 的 Razor 引擎默认对所有 @Model.Property 表达式执行 HTML 编码(例如将 <strong></strong> 转为 <strong></strong>),这是内置的安全机制,用于防范跨站脚本(XSS)攻击。当你从 SQLite 数据库读取含 HTML 标签的富文本(如 <p>Hello <em>world</em>!</p>)并直接通过 @Model.Content 输出时,浏览器会将其作为纯文本渲染,导致标签可见而非生效。
✅ 正确做法:使用 HtmlString(推荐服务层处理)或 @Html.Raw()(视图层快速方案):
方式一:在控制器/服务中封装为 HtmlString(更安全、更可控)
// 在 Controller 或 ViewModel 中
public class ArticleViewModel
{
public string RawHtmlContent { get; set; } // 来自数据库的原始 HTML
// 安全包装:仅当内容可信时才暴露为 HtmlString
public HtmlString RenderedContent =>
new HtmlString(RawHtmlContent ?? string.Empty);
}对应视图中:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
立即学习“前端免费学习笔记(深入)”;
@model ArticleViewModel @Model.RenderedContent @<!-- 自动输出未编码 HTML -->
方式二:在视图中直接使用 @Html.Raw()(便捷但需谨慎)
@model ArticleViewModel @Html.Raw(Model.RawHtmlContent)
⚠️ 重要安全提醒:
- 绝不可对用户直接提交、未经清洗的 HTML 使用上述方法——这将导致严重 XSS 漏洞;
- 若内容来自富文本编辑器(如 TinyMCE、Quill),建议在保存前使用 HTML 清洗库(如 HtmlSanitizer)过滤 script、iframe、on* 事件等危险节点;
- 避免混合使用:不要将
@Html.Raw()与未验证的@ViewData["Unsafe"]或@TempData值结合; - 开发阶段可启用
Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation并配合日志验证输出行为,但生产环境应禁用运行时编译。
总结:Razor 的自动编码是保护性默认行为,不是缺陷。解除编码必须有明确意图和严格的内容信任边界。优先在业务逻辑层构造 HtmlString,并在文档中清晰标注该字段“已审核为安全 HTML”,从而兼顾安全性与可维护性。


















