Rust PathBuf如何防止目录遍历攻击?

时间:2019-05-29 19:00:16

标签: rust rust-rocket

"A Case for Oxidation: The Rust Programming Language"中的塞尔吉奥·贝尼特斯说,

  

这是用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在这里做的不同(如果有的话)感到困惑。还有什么呢?

1 个答案:

答案 0 :(得分:2)

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

作者的意思是PathBuf的{​​{3}}的实现执行遍历攻击检查,并且如果失败则从不调用处理程序。

FromSegments通过返回FromSegments来考虑失败情况:

pub trait FromSegments<'a>: Sized {
    type Error: Debug;
    fn from_segments(segments: Segments<'a>) -> Result<Self, Self::Error>;
}