浏览器将、&、"、'视为语法分界符,漏转会导致解析错误或xss风险:如直接写5

浏览器解析HTML时怎么处理这类字符
浏览器在解析HTML时,会把、<code>>、&、"、'这五个字符当作语法分界符,而不是普通文本。一旦漏转,比如直接写5 ,解析器会在<code>处认为新标签开始,后面<code>10变成孤立文本,DOM结构错乱。它不会报错,但渲染结果不可控。
关键点在于:浏览器只对这五个字符做“强制语义识别”,其余Unicode字符(如中文、©、€、❤)在UTF-8页面中可直接写,无需实体编码——前提是<meta charset="UTF-8">存在且文件保存为UTF-8无BOM。
用DOMParser解析含非法实体的字符串会怎样
DOMParser().parseFromString(htmlStr, 'text/html')对非法实体完全静默:比如&xyz;、GG;、(超出Unicode范围)都会原样保留在textContent里,不替换、不报错、不警告。它只解合法实体,其余一律当普通文本。
这意味着你不能靠DOMParser来检测或修复非法实体。如果需要校验,得自己扫描:
- 正则匹配:
/&(?!(amp|lt|gt|quot|apos|#\d+|#x[0-9a-fA-F]+);)/g - 或用
he库:he.validate(str)返回布尔值 -
html.unescape()遇到非法实体会抛ValueError,可用来试探性识别
服务端转义后前端再用innerHTML要不要二次处理
不要。如果后端已用htmlspecialchars($str, ENT_QUOTES, 'UTF-8')或html.escape()输出,那字符串已经是安全的HTML实体形式。前端再用el.innerHTML = data即可,切勿再调用escapeHtml()或he.encode()——否则<p></p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5806" title="html-deploy"><img
src="https://img.php.cn/upload/skill/000/000/081/179066538882434.jpg" alt="html-deploy" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5806" title="html-deploy" class="overflowclass">html-deploy</a>
<p class="overflowclass">使用 htmlcode.fun 将 HTML 内容或文件部署到网页,适用于用户要求“部署到网页”“托管此 HTML”“生成此前端...的实时链接”等场景。</p>
</div>
<a rel="nofollow" href="/xiazai/skill5806" title="html-deploy" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>变成<p>,页面显示源码而非渲染效果。
常见陷阱:
- API返回JSON,字段值是原始字符串 → 前端插入前必须转义
- API返回HTML片段(
Content-Type: text/html)→ 通常已转义,直接innerHTML - React中用
dangerouslySetInnerHTML,传入值必须是未转义的原始HTML,不是实体串
Python里用html.parser提取文本时怎么避开实体陷阱
html.parser.HTMLParser默认开启convert_charrefs=True,但它只转换合法实体;&xyz;会被当作普通文本传进handle_data(),不会触发错误回调。
安全做法是:在handle_data()里拿到原始文本后,手动用html.unescape()还原,再捕获ValueError识别非法项:
try:
clean_text = html.unescape(raw_text)
except ValueError:
# 处理 &xyz; 这类非法实体,可记录或跳过
clean_text = raw_text
批量处理建议换he库,它对&ZZ;等容忍度更高,失败时返回原串而非抛异常。
最容易被忽略的是字符流源头:Node.js读文件用fs.readFileSync(path, 'utf8')可能隐含BOM,导致Tokenizer误判首字节;Python用open(..., encoding='utf-8-sig')能自动剥离BOM。编码层没对齐,再严谨的转义也白搭。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










