【发布时间】:2019-04-10 10:40:12
【问题描述】:
我有一个公用文件夹pub,其中包含子文件夹和文件。用户现在给了我一个相对文件路径,我执行一些映射,然后我用fstream 读取文件并将其返回给用户。
现在的问题是,如果用户给我一条路径,例如../fileXY.txt 或其他一些考虑路径遍历或其他类型的文件路径注入的花哨的东西。 fstream 只是会接受它并读取我的公共 pub 文件夹之外的潜在文件,或者更糟糕的是给他们我系统上所有文件的列表等...。
在重新发明轮子之前,我在文件系统库中进行了搜索 我已经看到有这个std::filesystem::canonical 函数并且有很多关于正常形式的讨论。我这里有个一般性的问题,这个函数和变种std::filesystem::weakly_canonical可以用来防止这类漏洞吗?那么基本上就够了吗?
此外,我系统的文件系统库仍处于实验模式,并且缺少std::filesystem::weakly_canonical。但我不能使用canonical,因为文件必须存在于canonical 中。就我而言,我有某些映射,并且文件在这种意义上不存在。所以我需要模仿weakly_canonical 函数,但是怎么做呢?
我在realpath for nonexisting paths 上看到了一个相关的 stackoverflow 问题,建议他重复规范,只要路径存在,然后将不存在的部分添加到其中,但这又容易受到此类注入的攻击。那么我是否必须推出自己的 weakly_canonical 或者我可以通过组合一些 std::experimental::filesystem 函数以某种方式模仿它?
【问题讨论】:
-
即使用户给了你这样的路径,你应该没有问题,因为安全性应该是每个用户并由操作系统检查。如果用户故意为您提供这样的路径并且对该文件具有写入权限,那么他们无论如何都可以在没有您的应用的情况下执行此操作。
-
@MichaelChourdakis 我不确定我是否理解正确。澄清一下,用户给了我一个相对路径,这是我的系统(服务器应用程序)的相对路径,他不是在他的系统上而是在服务器系统上读取文件。并且不应该允许他读取公共文件夹之外的文件。
-
对于服务器应用程序,无论如何都不应允许用户引用本地文件。为什么要从用户那里得到这样的输入?
-
您应该使用数据库来实现它。该数据库将存储用户上传的主键 ID,以及用户指定的文件名,该文件名仅用于显示目的。当您将列表呈现给用户下载时,您将呈现他指定的文件名,但使用 ID 从数据库中读取数据,而不是使用文件名。
-
@MichaelChourdakis 但这实际上是这里的问题。所以如果
std::filesystem::canonical可以防止这些安全问题。
标签: c++ std-filesystem