1

来自“氧化案例:Rust 编程语言” Sergio Benitez 说,

这是一个用 Rocket 编写的静态文件服务器。它正好是四行,保证不会受到目录遍历攻击。

这四行是:

#[get("/<path..>")]
fn files(path: PathBuf) -> Option<NamedFile> {
    NamedFile::open(Path::new("static/").join(path)).ok()
}

这张幻灯片的底部说,

  • FromParam*PathBuf验证路径安全的实现

我了解了一种类型如何通过验证输入来保证安全性(就像任何对象都可以在构造函数中一样,或者函数的输入如何用验证函数包装。

dangerousThing(validateSafety(input))

许多语言都提供了这一点。我也了解如何通过将其放入类型或类的构造函数中来简化它,

class Path {
  constructor(path) { this._path = validateSafety(path) }
}

但我对 Rust 在这里的不同之处(如果有的话)感到困惑。这还有什么?

4

2 回答 2

2

PathBuf不提供此类保证。它不能,因为在PathBuf使用 a 的所有域中都没有“目录遍历攻击”的概念。

作者的意思是 for 的实现FromSegments执行PathBuf遍历攻击检查,如果失败则永远不会调用处理程序。

FromSegments通过返回 a 允许失败案例Result

pub trait FromSegments<'a>: Sized {
    type Error: Debug;
    fn from_segments(segments: Segments<'a>) -> Result<Self, Self::Error>;
}
于 2019-05-29T19:05:26.197 回答
0

我们可以用 遍历部分路径components(),因此我们可以检查..使用情况,如下所示:

let p = PathBuf::from_str("/tmp/../etc/password").unwrap();
if p.components().into_iter().any(|x| x == Component::ParentDir) {
    return Err("directory traversal");
}
于 2021-10-10T12:27:48.900 回答