用户提供的JSON数据需安全清理吗?能否通过JSON注入恶意代码?
问题
我正在编写一个PHP脚本,功能是接收用户上传的JSON文件,通过json_decode($string, true)解析后打印数组中的值。过程中查看$GLOBALS数组时,发现所用的Drupal 7 CMS以明文形式暴露了数据库凭据。我现在有两个疑问:
- 攻击者能否通过提交恶意JSON文件,注入类似
var_dump($GLOBALS)的可执行代码? - 是否需要检查
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
相关产品推荐
相关产品推荐

