【问题标题】:How does a Rust PathBuf prevent directory traversal attacks?Rust PathBuf 如何防止目录遍历攻击?
【发布时间】:2019-10-15 10:37:18
【问题描述】:

来自"A Case for Oxidation: The Rust Programming Language"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 在这里所做的不同(如果有的话)感到困惑。还有什么其他的吗?

【问题讨论】:

    标签: rust rust-rocket


    【解决方案1】:

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

    作者的意思是FromSegmentsPathBuf的实现会执行遍历攻击检查,如果失败从不调用handler。

    FromSegments 允许通过返回 Result 来处理失败情况:

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

    【讨论】:

    • 所以它只是一个类型的构造函数,它接受输入,检查../(或父表示法),如果检测到则无法在运行时创建类型?
    【解决方案2】:

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

    let p = PathBuf::from_str("/tmp/../etc/password").unwrap();
    if p.components().into_iter().any(|x| x == Component::ParentDir) {
        return Err("directory traversal");
    }
    

    【讨论】:

      猜你喜欢
      • 2015-01-20
      • 1970-01-01
      • 2013-10-27
      • 1970-01-01
      • 1970-01-01
      • 2019-04-14
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      相关资源
      最近更新 更多