由于 encode_json 无声失败而导致空的 json 值储存
作者: simkoc创建于 2025年1月23日更新于 2025年1月23日
尝试在 php 文件中处理编码过的字符串时,我遇到了获取 json 运行失败的问题:
proofOcConcept.php
<?php
echo gzuncompress("KL");
echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";输出 json:
PHP-Parser $> ./bin/php-parse -j proofOfConcept.php
====> File ./proofOcConcept.php:
==> JSON dump:输出节点:
PHP-Parser $> ./bin/php-parse -d proofOfConceptPhp.php
====> File proofOfConceptPhp.php:
==> Node dump:
array(
0: Stmt_Echo(
exprs: array(
0: Expr_FuncCall(
name: Name(
name: gzuncompress
)
args: array(
0: Arg(
name: null
value: Scalar_String(
value: KL
)
byRef: false
unpack: false
)
)
)
)
)
1: Stmt_Echo(
exprs: array(
0: Scalar_String(
value: �
)
)
)
)深入研究此问题,并在 bin/php-parse 的第 85 行添加 JSON_THROW_ON_ERROR 标志,结果如下:
PHP-Parser $> ./bin/php-parse -j proofOfConcept.php
====> File ./proofOcConcept.php:
==> JSON dump:
PHP Fatal error: Uncaught JsonException: Malformed UTF-8 characters, possibly incorrectly encoded in /home/simon/tmp/PHP-Parser/bin/php-parse:85
Stack Trace:
#0 /home/simon/tmp/PHP-Parser/bin/php-parse(85): json_encode()
#1 {main}
thrown in /home/simon/tmp/PHP-Parser/bin/php-parse on line 85在同一行添加 JSON_INVALID_UTF8_IGNORE 标志似乎可以解决问题,并生成预期输出:
PHP-Parser $> ./bin/php-parse -j proofOfConcept.php
====> File ./proofOcConcept.php:
==> JSON dump:
[
{
... very long json file ....
}
]我使用的是最新的 Arch Linux,目前 PHP 版本为 8.3.15。
内容来源: nikic/PHP-Parser