将字符串编码为PHP中的文件路径片段

时间:2019-01-29 23:50:37

标签: php encode

在PHP中,函数urlencode()允许将字符串编码为url片段,对所有可能在url中具有特殊含义的字符进行编码。 urldecode()可逆编码。

我正在寻找类似的文件系统路径。 urlencode()可能已经在这里工作了,但似乎比需要的更具攻击性。例如。没有理由转义“()”括号。另一方面,点(尤其是双点)在文件系统路径(上一层)中可能具有特殊含义,因此也许需要对其进行编码。

PHP中是否有可用的工具,或者最接近手动进行的操作?

urlencode()是否为此目的安全,或者我们是否确实需要注意点?排除点作为第一个字符也许就足够了,但是允许它在路径的中间。

我当前的用例是Linux文件系统路径,但最后我可能希望将其放入应该在不同OS上可用的软件包中。

urlencode()一样,我正在寻找可逆的东西。因此,不仅要进行消毒,还要进行编码,以便对其进行解码。

理想情况下,编码路径仍应为人类可读。因此,最好在文件系统路径中允许的大多数字符保持不变。

用例

如果没有这种用例,上面的问题应该已经完成​​,但是有些人希望看到一个问题。

我有一种情况,我想将大量数据导出到不同的php文件中,并在读取/写入数据时将文件名/路径解释为数组键。

例如

foreach ($addresses as $name => $address) {
  file_put_contents($dir . '/' . FILEPATH_ENCODE($name), '<?php return ' . var_export($address, TRUE);');
}

将其存储在单独的文件中的好处是可以使用git轻松跟踪它们,并且将git冲突的可能性降到最低(与将它们全部集中在一个文件中相比)。在文件名/路径中编码数组键意味着我不再需要将其存储在文件本身中,从而减少了冗余。

扩展示例:返回闭包而不是值。

foreach ($addresses as $name => $closureBodyPhp) {
  file_put_contents($dir . '/' . FILEPATH_ENCODE($name), '<?php return function () {' . $closureBodyPhp . '};');
}

我要导出的数据或闭包是由现有系统提供的,而不是我自己决定的。

如果您真的想知道:我想替换Drupal 7 features,也就是说,将现有功能生成的php导出到一个集中目录中,而不是导出到单独的功能模块中。

但是,请不要对用例分散注意力。

0 个答案:

没有答案