【发布时间】:2018-10-02 06:47:26
【问题描述】:
我有一个应用程序可以正确转义文件名中的斜杠 ("/) 以避免路径遍历攻击。
秘密文件有这个路径:
/tmp/secret.txt
我想通过上传具有特制文件名(类似于\/tmp\/secret.txt)的文件来访问此文件
是否有任何不带斜杠的替代语法可供我使用,以便 Linux 读取此文件?
(我知道 URL 编码,但由于转义是在后端完成的,所以这对我没有用。)
【问题讨论】:
我有一个应用程序可以正确转义文件名中的斜杠 ("/) 以避免路径遍历攻击。
秘密文件有这个路径:
/tmp/secret.txt
我想通过上传具有特制文件名(类似于\/tmp\/secret.txt)的文件来访问此文件
是否有任何不带斜杠的替代语法可供我使用,以便 Linux 读取此文件?
(我知道 URL 编码,但由于转义是在后端完成的,所以这对我没有用。)
【问题讨论】:
没有。 / 不允许出现在文件名中,无论是否转义为 \/。
这是文件名中不允许的仅有的两个字符之一,另一个是\0。
这意味着您显然可以使用_tmp_secret.txt 或-tmp-secret.txt,或将路径中的/ 替换为您希望的任何其他字符,以创建带有“编码到其中”路径的文件名。但这样做时,您可以不对在其一个或多个路径组件中包含所选分隔符的路径名进行编码,并期望将其解码为原始路径名。
顺便说一下,这就是 OpenBSD 的 ports 系统如何为软件补丁编码文件名。在(例如)/usr/ports/shells/fish/patches 中,我们找到名称如下的文件
patch-share_tools_create_manpage_completions_py
它来自fish shell 源代码分发中特定文件的路径名(可能是share/tools/create_manpage_completions.py)。然而,这些路径名从不解析,并且编码只是为了为补丁本身创建独特且有点可理解的文件名。 真正的路径包含在补丁文件中。
【讨论】:
/的字符(如⁄∕╱⧸,参见there)之一。