1 个稳定版本
2.0.0 | 2023年2月27日 |
---|---|
1.0.1 |
|
#26 in #relative-path
9KB
Path trav
使用 Rust 制作的简单路径遍历检查器。适用于提供动态文件的 API。
注意:这是一个安全工具。如果您发现问题,请在 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