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

用户提供的JSON数据需安全清理吗?能否通过JSON注入恶意代码?

问题

我正在编写一个PHP脚本,功能是接收用户上传的JSON文件,通过json_decode($string, true)解析后打印数组中的值。过程中查看$GLOBALS数组时,发现所用的Drupal 7 CMS以明文形式暴露了数据库凭据。我现在有两个疑问:

  1. 攻击者能否通过提交恶意JSON文件,注入类似var_dump($GLOBALS)的可执行代码?
  2. 是否需要检查json_decode返回数组中的恶意代码?

我做了个测试,代码如下:

<?php
$jsTestString = '{ "identifier":{"inject":var_dump($GLOBALS) }}';
$jsonTestArray = json_decode($jsTestString, true);
print($jsonTestArray['identifier']['inject']);
// this thankfully doesn't work

测试结果是代码没有被执行,想确认背后的原因和潜在风险。

解答
  • 无法通过JSON注入PHP可执行代码:JSON是纯数据格式,仅支持字符串、数字、布尔值、数组、对象和null这几种数据类型,不支持可执行代码。你测试的JSON字符串本身是非法格式——var_dump($GLOBALS)没有被双引号包裹,不属于合法的JSON值,json_decode会直接返回null,根本不会解析执行这段PHP代码。即使攻击者构造合法的JSON(比如把代码作为字符串传入),json_decode也只会把它当作普通字符串处理,不会执行。

  • 无需检查返回数组中的“恶意代码”,但要注意输出/存储风险:

    • 如果你的脚本是在CLI环境打印结果,或者仅用于内部数据处理,基本没有风险;
    • 如果要把解析后的值输出到HTML页面,需要警惕XSS攻击——攻击者可能传入包含HTML/JS代码的字符串,此时必须用htmlspecialchars()对输出内容进行转义;
    • 如果要将数据存入数据库,需遵循常规的防SQL注入规范,使用预处理语句而非拼接SQL字符串。
  • 关于$GLOBALS中的数据库凭据:这个风险和JSON注入无关,只要你的脚本没有主动输出或泄露$GLOBALS的内容,攻击者无法通过JSON输入直接获取到这些凭据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 07:05:52