#path #security #fs #path-traversal

path_ratchet

在类型级别预防路径遍历攻击

3 个版本 (破坏性更新)

0.3.0 2023 年 12 月 9 日
0.2.0 2023 年 12 月 6 日
0.1.0 2023 年 12 月 4 日

#1103 in 文件系统

LGPL-3.0-only

18KB
198

Path Ratchet

LGPL 3.0 License Crates.io Workflow Status crev reviews

在类型级别预防路径遍历攻击。

use std::path::PathBuf;
use path_ratchet::prelude::*;

let user_input = "/etc/shadow";
let mut filename = PathBuf::from("/tmp");
filename.push_component(SingleComponentPath::new(user_input).unwrap());

lib.rs:

PathBuf::push 允许任何形式的路径遍历

#
let user_input = "/etc/shadow";
let mut filename = PathBuf::from("/tmp");
filename.push(user_input);
assert_eq!(filename, PathBuf::from("/etc/shadow"));

相反 <PathBuf as PushPathComponent>::push_component 要求路径只有一个元素。

use std::path::PathBuf;
use path_ratchet::prelude::*;

let user_input = "/etc/shadow";
let mut filename = PathBuf::from("/tmp");
filename.push_component(SingleComponentPath::new(user_input).unwrap());

安全性

检查路径的平台必须与使用它的平台相同。例如,路径 C:\path\to\file.txt 在 UNIX 系统上将被解释为文件或目录名。

SingleComponentPath::new(r"C:\path\to\file.txt").unwrap();

无运行时依赖