防xss关键在于精准转义输出:html上下文用htmlspecialchars($str, ent_quotes | ent_html5, 'utf-8');js上下文用json_encode($str, json_unescaped_unicode);富文本须用htmlpurifier白名单过滤,并辅以csp、httponly cookie等增强措施。

表单处理时防XSS,关键不是“过滤输入”,而是“精准转义输出”。所有从表单来的数据——无论是 $_GET、$_POST 还是数据库查出的内容,只要最终会渲染到 HTML 页面里,就必须在输出前做上下文适配的编码。
所有HTML文本和属性输出必须用 htmlspecialchars()
这是最基础也最容易被忽略的一环。比如:
-
<h2><?php echo $_POST['title']; ?></h2>—— 直接输出,危险 -
<input value="<?php echo $_POST['name']; ?>">—— 属性中未转义,同样危险
正确写法是统一使用:
htmlspecialchars($str, ENT_QUOTES | ENT_HTML5, 'UTF-8')
这个组合确保:单引号、双引号都转义;兼容 HTML5 实体(如 ');明确指定 UTF-8 编码,避免多字节截断绕过。别用无参 htmlspecialchars($str),它默认只转双引号,单引号属性仍可被突破。
JS上下文里不能只靠 htmlspecialchars()
当用户数据要放进 JavaScript 字符串,例如:
<script>var msg = "<?php echo $_POST['msg']; ?>";</script>
即使用了 htmlspecialchars(),攻击者仍可通过闭合引号注入代码(如输入 " 后跟恶意 JS)。这时必须用:
json_encode($str, JSON_UNESCAPED_UNICODE)
并确保外层不加额外引号:
<script>var msg = <?php echo json_encode($_POST['msg'], JSON_UNESCAPED_UNICODE); ?>;</script>
JSON 编码能安全处理引号、反斜杠、Unicode 等所有 JS 字符边界问题。
富文本内容必须用白名单过滤器
如果表单允许用户提交带格式的内容(如论坛发帖、商品描述),htmlspecialchars() 会把所有标签都干掉,strip_tags() 又拦不住 <img onerror="alert(1)"> 这类变体攻击。
正确做法是引入 HTMLPurifier 这类专业库,配置白名单规则,例如只允许 <p></p>、<strong></strong>、<img src>,且禁止 onerror、javascript: 等危险属性。手写正则或黑名单过滤不可靠,极易被大小写混淆、注释干扰等方式绕过。
补充防御增强可信度
除了编码,还可叠加以下措施提升整体防护水位:
- 设置
Content-Security-PolicyHTTP 头,限制内联脚本和外部资源加载 - 为 Cookie 添加
HttpOnly和SameSite标志,降低 XSS 后果 - 避免在
data-属性中直接插入未处理的用户数据,同样需json_encode() - 禁用已废弃的
magic_quotes_gpc或addslashes()做 XSS 防护——它们对 XSS 完全无效
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











