You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP中使用json_encode输出JS变量是否存在XSS注入风险?

原始写法风险判定

无参数调用json_encode($_GET['field'])直接输出到JS的写法存在明确XSS注入风险,核心原因是HTML解析优先级和默认转义规则的冲突:

  • 浏览器解析HTML时,遇到</script>序列会直接闭合当前脚本块,不会判断这段内容是否处于JS字符串内部
  • 无参数的json_encode不会转义<、>字符,攻击者传入</script><script>alert('xss')</script>作为GET参数时,输出内容会直接截断现有脚本块,注入执行任意恶意JS代码
  • 额外隐患:如果传入值是数组、对象等非字符串类型,json_encode会输出数组/对象字面量而非字符串,不符合“固定赋值为字符串”的需求;遇到特殊无法编码的值时还可能返回false,触发JS语法错误。
最佳安全实现方案

你当前使用的json_encode($_GET['field'], JSON_HEX_TAG|JSON_UNESCAPED_UNICODE)已经解决了核心XSS风险,要做到100%覆盖边界场景、严格保证无论传入什么内容都输出合法的JS字符串字面量,可以做两处补强:一是强制将输入转为字符串类型,二是增加编码错误处理。
最终安全写法:

const field = <?= json_encode(
    (string)$_GET['field'],
    JSON_HEX_TAG | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR
) ?>;

各部分作用说明:

  • 前置(string)强转:保证无论传入什么类型的参数,最终编码的都是字符串值,输出结果一定是合法的JS字符串字面量,不会出现数组、对象等非预期赋值结果
  • JSON_HEX_TAG:将所有<、>字符转义为\u003C、\u003E,从根源上避免出现</script>这类能截断脚本块的字符序列,堵死最主流的XSS注入路径
  • JSON_UNESCAPED_UNICODE:保留中文等原生Unicode字符不转义,不影响安全性,仅提升代码可读性
  • JSON_THROW_ON_ERROR:编码失败时直接抛出异常,避免返回false、空值等异常内容导致JS语法错误(该参数PHP 7.3及以上版本支持,低版本可以在编码后通过json_last_error()手动判断错误)

注意:该方案仅适用于将值输出到普通JS脚本块内的变量赋值位置,如果要把值输出到HTML事件属性、链接href等特殊位置,需要对应场景的额外转义处理,不能直接复用这套逻辑。

内容的提问来源于stack exchange,提问作者Abderrahim Benmelouka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.31 00:36:26