我正在寻找一个PHP函数来将字符串清理成安全和有效的文件名,而不使用目录分隔符(斜杠)。PHP:推荐的方法来避免路径中的斜线(例如,以防止目录遍历攻击)
理想情况下,它应该是可逆的,它不应该争取更多的名称。
当然我想防止故意的目录遍历攻击。但我也想防止创建子文件夹。
我认为urlencode()
会工作,但我想知道这是否足够,和/或如果有更好的或更受欢迎的东西。
此外,如果在Windows上有一些功能同样好(反斜杠作为目录分隔符) - 所以解决方案将是可移植的。
使用案例/情景:
作为数据导入的一部分,我想下载从远程URL文件到本地文件系统。这些网址来自csv文件。它们大多数都可以,但它们可能包含比预期更多的斜线。
E.g.他们大多是这样的:
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编码也被其他许多人使用。 – Kaii
“理想情况下,它应该是可逆的,它不应该争取更多的名字” - 原始问题的一部分:) – donquixote
一个好的答案是一个不仅适用于我而且对其他访问者有用的答案。它可能首先关注可逆情况(其中urlencode()可能是选择的解决方案),然后为需求略有不同的人提供一种或多种替代方案。 – donquixote