#file-path #path #security #relative-path #fs #path-traversal

path_trav

简单的路径遍历检查器。适用于提供动态文件的 API。

1 个稳定版本

2.0.0 2023年2月27日
1.0.1 2022年11月21日

#26 in #relative-path

Apache-2.0

9KB

Path trav

使用 Rust 制作的简单路径遍历检查器。适用于提供动态文件的 API。


license crates.io docs.rs discord


注意:这是一个安全工具。如果您发现问题,请在 GitHub 上提交问题

工作原理?

is_path_trav 函数在 std::path::Path 中实现。它接收两个路径,基础路径和要检查的路径。要验证第二个是否在第一个内部,path_trav 将路径转换为绝对路径,并检查第二个路径是否包含第一个。

示例 1。

基础路径: /home/user/data   -->  /home/user/data

相对路径: ./data/folder          -->  /home/user/data/folder

相对路径在基础路径内部。

示例 2。

基础路径: /home/user/data              -->  /home/user/data

相对路径: ./data/../../../etc/passwd   -->  /etc/passwd

相对路径不在基础路径内部,尝试访问敏感数据

示例

首先,将 path_trav 添加到您的 Cargo.toml 文件中

[dependencies]
path_trav = "2.0.0"

然后,在您的 main.rs 文件中

use std::path::Path;
use path_trav::*;

fn main() {
    let server_folder       = Path::new("./");
    let server_file         = Path::new("./tests/test.rs");
    let important_file      = Path::new("~/../../etc/passwd");
    let non_existent_file   = Path::new("../weird_file");

    // Path is inside server_folder (Ok)
    assert_eq!(Ok(false), server_folder.is_path_trav(&server_file));

    // Path tries to acces sensitive data (Path Traversal detected)
    assert_eq!(Ok(true), server_folder.is_path_trav(&important_file));

    // File does not exists (ENOENT)
    assert_eq!(Err(ErrorKind::NotFound), server_folder.is_path_trav(&non_existent_file));
}

is_path_trav 返回 Result<bool, std::io::ErrorKind>。展开它或使用 match 获取结果。如果返回 true,存在路径遍历。

注意:您可以使用 PathBuf

use std::path:PathBuf

let server_folder   = PathBuf::from("./");
let server_file     = PathBuf::from("./tests/test.rs");

assert_eq!(Ok(false), server_folder.is_path_trav(&server_file));

测试

/tests 文件夹中有一组集成测试,您可以检查 Path Trav 的行为。

许可协议

path_trav 使用 Apache 2.0 许可协议

贡献

🥳 欢迎任何 PR!这是一个小型项目,因此指南是遵循代码风格,不要做出疯狂的目标。

Gátomo - Apache 2.0 许可协议

依赖项

~11KB