【发布时间】:2011-09-01 04:40:40
【问题描述】:
我正在用 PHP 编写一个命令行应用程序,它接受本地输入文件的路径作为参数。输入文件将包含以下内容之一:
- JSON 编码的关联数组
-
serialized()版本的关联数组 -
serialized()关联数组的 base 64 编码版本 - Base 64 编码的 JSON 编码的关联数组
- 一个普通的旧 PHP 关联数组
- 垃圾
简而言之,一旦我真正弄清楚了格式,就有几个我无法控制的不同程序将以我能理解的统一方式写入这个文件。一旦我弄清楚如何摄取数据,我就可以使用它了。
我正在考虑的是:
- 如果文件的第一个字节是
{,试试json_decode(),看看是否失败。 - 如果文件的第一个字节是
<或$,试试include(),看看会不会失败。 - 如果文件的前三个字节匹配 a:[0-9],请尝试
unserialize()。 - 如果不是前三个,试试
base64_decode(),看看会不会失败。如果不:- 再次检查解码数据的第一个字节。
- 如果所有这些都失败了,那就是垃圾。
对于一个相当简单的任务来说,这似乎相当昂贵。我可以用更好的方式来做吗?如果有,怎么做?
【问题讨论】:
-
这是一个完美的例子,约定在其中发挥作用。如果您知道 all JSON 文件以 .json 结尾,则无需解析。但是,如果您无法控制环境,那么运行不受信任的代码(使用
include)是相当不安全的。 -
我会让用户简单地指出它是什么类型的文件,然后对其进行完整性检查。这种自动化方法似乎很有可能受到奇怪的边缘情况的影响。
-
include会以什么方式失败? -
@rdineiu 不幸的是,扩展是不可能的。我正在阅读一个名为“转储”的文件,同时将一些不同的系统拼接成一个连贯的前端。 @lonesomeday
include()如果在使用后无法联系到成员,则会失败,谢天谢地,数组的成员都是相同的......只是格式不同。 -
将文件写入磁盘时,是否可以在文件开头插入一个额外的字节?如果是这样,您可以使该字节确定文件的类型,然后将其剥离。