PHP防XSS核心是按上下文选择编码方式:HTML输出用htmlspecialchars(),JS变量用json_encode()加htmlspecialchars(),JSON接口用json_encode()配合正确header,禁用正则过滤和客户端校验。

在PHP中过滤JavaScript特殊字符,核心目标是防止XSS(跨站脚本)攻击,而不是简单地“删掉所有JS字符”。关键在于根据使用场景选择合适的方法:输出到HTML、插入到JavaScript代码块、或作为JSON数据传递,每种情况的处理方式不同。
输出到HTML内容时:用 htmlspecialchars() 转义
当用户输入要显示在网页HTML中(如评论、昵称、文章标题),需转义<、>、"、'、&等字符,使其不被浏览器解析为标签或脚本:
- 推荐写法:
echo htmlspecialchars($user_input, ENT_QUOTES | ENT_HTML5, 'UTF-8'); -
ENT_QUOTES同时转义单引号和双引号,对嵌入属性值更安全 - 务必指定字符编码(如
'UTF-8'),避免多字节截断漏洞 - 不要用
strip_tags()替代——它只删标签,不防<img onerror=alert(1)>这类事件注入
插入到内联<script>或事件属性中:避免直接拼接</script>
绝对不要这样写:<button onclick="doSomething('<?php echo $user_input; ?>')">。单引号、双引号、反斜杠、
- 正确做法:把数据先输出到HTML的
data-属性,再用JS读取:<div id="myEl" data-value="<?php echo htmlspecialchars($val, ENT_QUOTES); ?>"> - 或统一走JSON接口:PHP返回JSON,前端用
fetch()获取,天然隔离执行环境 - 若必须内联JS,用
json_encode()并加htmlspecialchars()双重保护:var val = <?php echo htmlspecialchars(json_encode($user_input), ENT_QUOTES); ?>;
作为JSON数据返回给前端:用 json_encode() + 正确header
API接口返回JSON时,json_encode()本身已对引号、反斜杠、控制字符做了转义,但要注意:
立即学习“PHP免费学习笔记(深入)”;
- 始终设置响应头:
header('Content-Type: application/json; charset=utf-8'); - 对用户数据调用
json_encode($data, JSON_UNESCAPED_UNICODE | JSON_HEX_TAG | JSON_HEX_AMP),强制转义<和&(防老版本IE MIME嗅探) - 避免在JSON外再拼HTML字符串——JSON就该纯数据,渲染逻辑交给前端框架或安全模板
不推荐的“过滤”方式
以下方法看似“过滤JS”,实则无效甚至有害:
str_replace(['<script> —— 易被绕过(大小写、空格、编码、Unicode变体)</script>-
preg_replace('/]*?javascript:[^>]*?>/i', '', $html)—— 正则无法可靠解析HTML,破坏结构且漏报率高 - 仅用
strip_tags()—— 不阻止<img src=x onerror=...>或CSS表达式 - 依赖客户端JS过滤 —— 可被禁用或绕过,服务端必须做最终校验
本质不是“过滤JS字符”,而是按上下文选择正确的编码/序列化方式。输出到HTML用htmlspecialchars,进JS变量用json_encode,进JSON用json_encode加header,永远不拼接不可信数据到执行环境中。



















