16个版本

0.6.0 2024年7月22日
0.5.6 2023年10月30日
0.5.5 2023年9月19日
0.5.1 2023年8月7日
0.1.0 2023年8月3日

#1372 in 网络编程

Download history 115/week @ 2024-04-16 123/week @ 2024-04-23 145/week @ 2024-04-30 181/week @ 2024-05-07 93/week @ 2024-05-14 106/week @ 2024-05-21 2/week @ 2024-05-28 14/week @ 2024-06-04 55/week @ 2024-06-11 26/week @ 2024-07-16 206/week @ 2024-07-23 74/week @ 2024-07-30

每月306次下载
用于 http-acl-reqwest

Apache-2.0

72KB
1.5K SLoC

http-acl

HTTP请求的访问控制列表。

为什么?

允许用户创建任意HTTP请求或指定任意URL进行抓取的系统,例如webhooks,容易受到SSRF攻击。例如,恶意用户可能拥有一个解析到私有IP地址的域名,然后使用该域名对内部服务进行请求。

此crate提供了一种简单的ACL,允许您指定哪些主机、端口和IP范围允许访问。然后可以使用ACL确保在请求发出之前,用户的请求符合ACL的要求。

用法

use http_acl::{HttpAcl, IpNet};

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // Create an HTTP ACL
    let acl = HttpAcl::builder()
        .add_allowed_host("example.com".to_string())
        .unwrap()
        .add_allowed_host("example.org".to_string())
        .unwrap()
        .add_denied_host("example.net".to_string())
        .unwrap()
        .add_allowed_port_range(8080..=8080)
        .unwrap()
        .add_denied_port_range(8443..=8443)
        .unwrap()
        .add_allowed_ip_range("1.0.0.0/8".parse::<IpNet>().unwrap())
        .unwrap()
        .add_denied_ip_range("9.0.0.0/8".parse::<IpNet>().unwrap())
        .unwrap()
        .build();

    // Check if a request is allowed
    assert!(acl.is_host_allowed("example.com").is_allowed());
    assert!(acl.is_host_allowed("example.org").is_allowed());
    assert!(!acl.is_host_allowed("example.net").is_allowed());
    assert!(acl.is_port_allowed(8080).is_allowed());
    assert!(!acl.is_port_allowed(8443).is_allowed());
    assert!(acl.is_ip_allowed(&"1.1.1.1".parse().unwrap()).is_allowed());
    assert!(acl.is_ip_allowed(&"9.9.9.9".parse().unwrap()).is_denied());
    assert!(acl
        .is_ip_allowed(&"192.168.1.1".parse().unwrap())
        .is_denied());

    Ok(())
}

文档

docs.rs

依赖项

~1.4–2.3MB
~69K SLoC