如何将SQL Server数据库中存储的HTML标签正确渲染到HTML页面
问题原因
- 所有现代前端框架、模板引擎默认开启了动态内容HTML转义机制:会自动将
<转换为<、>转换为>等HTML字符实体,该设计的初衷是避免恶意用户提交的HTML/JS代码被执行,防范XSS注入攻击。 - 你从SQL Server中取出的原始
<p> this is the first post </p>内容本身是正常的,转义操作发生在前端内容渲染环节,并非数据库存储的问题。
解决方案
不同技术栈使用对应「非转义输出原始HTML」的语法即可:
- 原生JavaScript:不要使用
innerText赋值,改用innerHTML属性插入内容// 错误写法 document.getElementById('content-container').innerText = contentFromDatabase // 正确写法 document.getElementById('content-container').innerHTML = contentFromDatabase - Vue框架:使用
v-html指令渲染内容<div v-html="contentFromDatabase"></div> - React框架:使用
dangerouslySetInnerHTML属性<div dangerouslySetInnerHTML={{__html: contentFromDatabase}}></div> - Laravel Blade模板:使用
{!! !!}语法输出,不要用默认的{{ }}转义语法<div>{!! $contentFromDatabase !!}</div> - 其他模板引擎(Thymeleaf、EJS、Django模板等):直接查阅官方文档中「原始HTML输出」「非转义输出」的对应语法即可。
安全提示
直接渲染原始HTML存在XSS攻击风险,如果你的存储的HTML内容是普通用户可提交编辑的,需要在内容入库前或者渲染前做HTML安全过滤,移除
<script>标签、onclick/onload等事件属性,避免恶意代码被执行。
内容的提问来源于stack exchange,提问作者jeremy.o
相关产品推荐
相关产品推荐

