#1064·PHP-Parser

由于 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