Blazor 怎么安全地渲染 HTML 内容
发布时间 - 2025-12-27 00:00:00 点击率:次Blazor 中安全渲染 HTML 的关键是仅对完全可信内容使用 MarkupString,对用户输入必须经服务端 HtmlSanitizer 净化后才可渲染,优先采用纯文本、Markdown 或代码高亮等更安全的替代方案。
Blazor 中安全地渲染 HTML 内容,核心是避免直接使用 @((MarkupString)html) 渲染不可信来源的字符串——这会绕过所有 XSS 防护,等同于执行任意脚本。
只对完全可信的内容使用 MarkupString
MarkupString 本身不做过滤或转义,它只是告诉 Blazor “这段字符串已由你(开发者)审核过,可以按 HTML 解析”。所以仅限以下情况使用:
- 硬编码的静态 HTML(如
@((MarkupString)"标题")) - 服务端严格白名单过滤后返回的内容(例如 CMS 后台人工审核+服务端 HTML sanitizer 处理过的字段)
- 客户端生成的、不含用户输入的 HTML(如纯图标 SVG 字符串)
对用户输入内容必须先净化再渲染
来自表单、API、数据库的富文本(如用户评论、编辑器内容),绝不能直接转 MarkupString。推荐在服务端用成熟库净化:
- .NET 服务端:用 HtmlSanitizer(
支持自定义白名单标签、属性、CSS、URI 协议) - 示例(服务端 API):
var sanitizer = new HtmlSanitizer();
sanitizer.AllowedTags.Add("p"); sanitizer.AllowedTags.Add("em");
sanitizer.AllowedAttributes.Add("class");
string cleanHtml = sanitizer.Sanitize(dirtyHtml); // 返回净化后字符串 - Blazor 组件中接收 cleanHtml 后,再用
@((MarkupString)cleanHtml)
优先考虑非 HTML 方案替代渲染
很多场景其实不需要真正渲染 HTML,更安全的做法是:
- 纯文本展示 → 用
@text(自动 HTML 编码) - 有限格式(粗体/斜体/链接)→ 用 Markdown 解析器(如 MarkdownBlazor),它默认只输出安全 HTML
- 需要高亮代码 → 用
+ 客户端语法高亮库(如 highlight.js),内容作为 text 插入,不解析 HTML
禁用危险属性和事件处理(补充防护)
即使用了 HtmlSanitizer,也要确保 Blazor 渲染时不会激活危险行为:
- 确认净化配置禁用了
on*事件属性(如onclick)、javascript:协议、data:URI 等 - 避免在组件中手动绑定
@onclick到动态 HTML 元素(Blazor 不支持运行时绑定事件到 MarkupString 渲染的节点) - 不要用
ElementReference+ JS 互操作去操作未净化的 HTML 节点
基本上就这些。关键不是“怎么让 MarkupString 更安全”,而是“什么时候不该用 MarkupString”——把净化做在上游,把信任边界划清楚。
# css
# javascript
# java
# html
# js
# markdown
# svg
# cms
# 编码
# .net
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
Laravel Livewire是什么_使用Laravel Livewire构建动态前端界面
Angular 表单中正确绑定输入值以确保提交与验证正常工作
为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】
如何选择可靠的免备案建站服务器?
Laravel如何实现多表关联模型定义_Laravel多对多关系及中间表数据存取【方法】
java ZXing生成二维码及条码实例分享
jQuery validate插件功能与用法详解
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
魔毅自助建站系统:模板定制与SEO优化一键生成指南
Laravel如何记录自定义日志?(Log频道配置)
手机网站制作与建设方案,手机网站如何建设?
在Oracle关闭情况下如何修改spfile的参数
如何快速搭建高效可靠的建站解决方案?
美食网站链接制作教程视频,哪个教做美食的网站比较专业点?
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
如何为不同团队 ID 动态生成多个独立按钮
Edge浏览器如何截图和滚动截图_微软Edge网页捕获功能使用教程【技巧】
青岛网站建设如何选择本地服务器?
Laravel中Service Container是做什么的_Laravel服务容器与依赖注入核心概念解析
javascript中数组(Array)对象和字符串(String)对象的常用方法总结
深圳网站制作的公司有哪些,dido官方网站?
简历没回改:利用AI润色让你的文字更专业
Laravel怎么解决跨域问题_Laravel配置CORS跨域访问
Laravel如何实现数据导出到PDF_Laravel使用snappy生成网页快照PDF【方案】
Laravel怎么使用Collection集合方法_Laravel数组操作高级函数pluck与map【手册】
如何用好域名打造高点击率的自主建站?
Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】
浏览器如何快速切换搜索引擎_在地址栏使用不同搜索引擎【搜索】
香港服务器部署网站为何提示未备案?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
JS实现鼠标移上去显示图片或微信二维码
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
html5的keygen标签为什么废弃_替代方案说明【解答】
Laravel如何优雅地处理服务层_在Laravel中使用Service层和Repository层
HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】
如何用JavaScript实现文本编辑器_光标和选区怎么处理
SQL查询语句优化的实用方法总结
Laravel如何为API生成Swagger或OpenAPI文档
如何快速使用云服务器搭建个人网站?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
Laravel事件监听器怎么写_Laravel Event和Listener使用教程
微信h5制作网站有哪些,免费微信H5页面制作工具?
Python文件流缓冲机制_IO性能解析【教程】
如何自定义建站之星模板颜色并下载新样式?
如何在宝塔面板中修改默认建站目录?
Python数据仓库与ETL构建实战_Airflow调度流程详解
java中使用zxing批量生成二维码立牌
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?


支持自定义白名单标签、属性、CSS、URI 协议)