4 个版本

0.2.0 2023 年 7 月 7 日
0.1.2 2023 年 5 月 26 日
0.1.1 2023 年 5 月 26 日
0.1.0 2023 年 5 月 26 日

834文件系统

Download history 247/week @ 2024-03-14 95/week @ 2024-03-21 221/week @ 2024-03-28 172/week @ 2024-04-04 89/week @ 2024-04-11 158/week @ 2024-04-18 61/week @ 2024-04-25 36/week @ 2024-05-02 62/week @ 2024-05-09 104/week @ 2024-05-16 89/week @ 2024-05-23 63/week @ 2024-05-30 117/week @ 2024-06-06 126/week @ 2024-06-13 58/week @ 2024-06-20 93/week @ 2024-06-27

396 每月下载量

Apache-2.0

9KB
164

Tower 中间件用于清理路径。

任何用于访问底层文件系统的路径遍历技术都将从请求路径中移除。例如,一个带有 /../../passwd 的请求在传递给内部服务之前将变为 /passwd

示例

use http::{Request, Response, StatusCode};
use hyper::Body;
use std::{iter::once, convert::Infallible};
use tower::{ServiceBuilder, Service, ServiceExt};
use tower_sanitize_path::SanitizePathLayer;

# #[tokio::main]
# async fn main() -> Result<(), Box<dyn std::error::Error>> {
async fn handle(req: Request<Body>) -> Result<Response<Body>, Infallible> {
    // `req.uri().path()` will not be usable to traverse the filesystem
    # Ok(Response::new(Body::empty()))
}

let mut service = ServiceBuilder::new()
    // sanitize the paths
    .layer(SanitizePathLayer)
    .service_fn(handle);

// call the service
let request = Request::builder()
    // `handle` will see `/secret`
    .uri("/../../secret")
    .body(Body::empty())?;

service.ready().await?.call(request).await?;
#
# Ok(())
# }

依赖项

~640KB
~10K SLoC