【发布时间】:2016-06-11 20:21:22
【问题描述】:
我正在寻找一个 PHP 函数来将字符串清理为安全有效的文件名,并且没有目录分隔符(斜杠)。
理想情况下,它应该是可逆的,并且不应过度扰乱名称。
当然我想防止故意的目录遍历攻击。但我也想防止创建子文件夹。
我认为urlencode() 会起作用,但我想知道这是否足够,和/或是否有更好或更受欢迎的东西。
此外,如果有一些东西在 Windows 上同样有效(反斜杠作为目录分隔符) - 那么该解决方案将是可移植的。
用例/场景:
作为数据导入的一部分,我想将文件从远程 url 下载到本地文件系统。网址来自 csv 文件。它们中的大多数都可以,但它们可能包含比预期更多的斜线。
例如大部分都是这样的:https://files.example.com/pdf/12345.pdf
但是个别文件可能是这样的:https://files.example.com/pdf/1/2345.pdf
所有文件都应该放在同一个目录中,例如
https://files.example.com/pdf/12345.pdf -> /destination/dir/12345.pdf
1/2345.pdf 之类的文件不应生成子目录。相反,/ 应该以某种(可逆)方式转义。例如。使用 urlencode() 这将是 1%2F2345.pdf。
【问题讨论】:
-
您还有其他要求吗?可读性?双向转换? (即从文件名中获取原始 URL?)许多其他人也使用 URL 编码。
-
“理想情况下它应该是可逆的,并且不应过度扰乱名称”-原始问题的一部分:)
-
一个好的答案不仅对我有用,对其他访问者也有用。它可以首先关注可逆情况(其中 urlencode() 可能是首选的解决方案),然后为要求略有不同的人提出一个或多个替代方案。
-
而且,只是说:“可逆”解决方案还具有防止名称冲突的优点。
-
刚刚更新了我的答案,看看
标签: php escaping directory-traversal