必须显式传参htmlspecialchars($str, ENT_QUOTES, 'UTF-8'),因无参调用仅转义双引号,单引号属性可被绕过;ENT_QUOTES确保单双引号均转义,UTF-8防止多字节编码绕过。

所有用户数据输出到 HTML 页面前,必须用 htmlspecialchars() 显式传参处理,否则 XSS 几乎必然发生。
为什么 htmlspecialchars() 必须带三个参数
无参调用 htmlspecialchars($str) 只转义双引号,单引号属性(如 value='')可被绕过;htmlentities() 会把中文、emoji 全部转成实体,破坏内容可读性且不可逆;而 htmlspecialchars($str, ENT_QUOTES | ENT_HTML5, 'UTF-8') 才是安全底线:
-
ENT_QUOTES同时转义单双引号,堵住属性值注入漏洞 -
ENT_HTML5兼容 HTML5 实体(比如'),避免解析歧义 -
'UTF-8'显式声明编码,防止多字节截断绕过(尤其在旧版 PHP 或非 UTF-8 数据库连接时)
JS 上下文里 htmlspecialchars() 完全无效
当用户数据插入 JavaScript 字符串(如 var msg = "";),浏览器按 JS 语法解析,不是 HTML。此时 htmlspecialchars() 不处理反斜杠、Unicode 转义或 JS 特有字符,攻击者仍可构造 "\u0022;alert(1)// 触发执行。
正确做法是:json_encode($user, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP | JSON_HEX_APOS | JSON_HEX_QUOT),并确保外层用双引号包裹(var msg = ;)。别用 addslashes() 或手写 str_replace() —— JS 解析器不吃这套。
富文本不能靠 htmlspecialchars() 或 strip_tags()
论坛、商品描述等需要保留
、 的场景,htmlspecialchars() 会把所有标签干掉,strip_tags() 则完全拦不住 、注释混淆(










