
在 ASP.NET Core MVC 中,默认会对 Razor 视图中的表达式进行 HTML 编码以防止 XSS 攻击;若需原样渲染数据库中可信的 HTML 内容,应使用 HtmlString 或 IHtmlContent 类型显式绕过编码,但必须确保内容来源可信。
在 asp.net core mvc 中,默认会对 razor 视图中的表达式进行 html 编码以防止 xss 攻击;若需原样渲染数据库中可信的 html 内容,应使用 htmlstring 或 ihtmlcontent 类型显式绕过编码,但必须确保内容来源可信。
在 ASP.NET Core MVC 中,Razor 引擎默认会对 正文@Model.Content、@ViewData["Html"] 等动态输出执行 HTML 编码(例如 → ),这是内置的安全机制,用于防范跨站脚本(XSS)攻击。因此,当你从 SQLite 数据库读取含 HTML 标签的富文本(如 )并直接在视图中写 标题
@Model.HtmlContent 时,浏览器实际接收到的是被转义的字符串,导致标签以纯文本形式显示,而非被解析为真实 HTML。
✅ 正确做法:使用 HtmlString 显式声明内容为“已安全处理的 HTML”
假设你的模型定义如下:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
public class Article
{
public int Id { get; set; }
public string Title { get; set; }
public string RawHtmlContent { get; set; } // 来自数据库的原始 HTML 字符串
}
在控制器中,将其包装为 HtmlString 后传递给视图:
public IActionResult Details(int id)
{
var article = _context.Articles.Find(id);
// ✅ 关键:将原始 HTML 字符串封装为 HtmlString
ViewBag.SafeHtml = new HtmlString(article?.RawHtmlContent ?? "");
return View(article);
}
然后在 .cshtml 视图中直接输出(无需 @Html.Raw()):
@model Article
<h1>@Model.Title</h1>
@* 方式1:使用 ViewBag 中的 HtmlString *@
@ViewBag.SafeHtml
@* 方式2:在模型中直接返回 HtmlString(更推荐) *@
@functions {
public IHtmlContent GetHtmlContent() => new HtmlString(Model.RawHtmlContent ?? "");
}
@GetHtmlContent()
⚠️ 重要安全警告:
绝不可对用户输入、第三方 API 返回或未经清洗的富文本使用 HtmlString 或 @Html.Raw()。若内容可能包含 <script></script>、onerror=、javascript: 等危险片段,将直接导致 XSS 漏洞。仅当满足以下全部条件时才可启用 HTML 渲染:
- 内容由可信管理员后台录入;
- 数据库字段内容经过服务端白名单过滤(如使用 HtmlSanitizer);
- 应用场景明确要求富文本展示(如 CMS 文章正文)。
? 替代方案(更安全):
如需兼顾安全性与富文本能力,推荐在服务层预处理 HTML:
// 安装包:dotnet add package HtmlSanitizer
var sanitizer = new HtmlSanitizer();
sanitizer.AllowedTags.Add("p", "h1", "h2", "strong", "em", "ul", "li");
string safeHtml = sanitizer.Sanitize(model.RawHtmlContent);
ViewBag.SafeHtml = new HtmlString(safeHtml);
总结:ASP.NET Core 的自动 HTML 编码是默认保护伞;主动解除需承担安全责任。优先使用 HtmlString 封装可信 HTML,避免滥用 @Html.Raw();对任何不可信输入,务必先净化再渲染。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










