C++中的路径清理

zak*_*akk 4 c++ unix linux sanitization path

我正在写一个小型的只读FTP服务器.客户说"给我那个文件",我的服务器发送它.

是否有任何标准方式(库函数?!?)以确保所请求的文件不是"../../../../../etc/passwd"或任何其他不好的东西?如果我可以将所有查询限制到目录(及其子目录),那将是很棒的.

谢谢!

Pet*_*acs 17

Chroot可能是最好的方法,但您可以使用它realpath(3)来确定给定文件名的规范路径.从手册页:

 char *realpath(const char *file_name, char *resolved_name);
Run Code Online (Sandbox Code Playgroud)

realpath()函数解析所有符号链接,额外的'/'字符以及对filename中的/./和/../的引用,并将得到的绝对路径名复制到由已解析名称引用的内存中.resolved_name参数必须引用能够存储至少PATH_MAX字符的缓冲区.

从那里,您可以以任何其他方式限制请求.


Duc*_*uck 5

还要看看chroot


Rya*_*roi 1

获取根 (/) 目录和服务目录(例如 /ftp/pub)的 inode。对于他们请求的文件,请确保:

  1. 该文件存在。
  2. 文件的父级(在文件路径上使用多个“/..”访问)在到达根目录 inode 之前先到达服务目录 inode。

您可以使用它stat来查找任何目录的索引节点。将其放入一个函数中,并在提供文件之前调用它。

当然,使用具有适当权限的用户/组也可以。