#security-policy #security #csp #http #validation

内容安全策略

将解析并验证第 3 级内容安全策略

11 个不稳定版本

0.5.2 2024年7月29日
0.5.1 2023年5月22日
0.5.0 2023年2月25日
0.4.2 2020年7月8日
0.0.0 2017年10月2日

#219 in 网络编程

Download history 1316/week @ 2024-04-23 1228/week @ 2024-04-30 1027/week @ 2024-05-07 1091/week @ 2024-05-14 1307/week @ 2024-05-21 1310/week @ 2024-05-28 791/week @ 2024-06-04 1357/week @ 2024-06-11 1965/week @ 2024-06-18 1496/week @ 2024-06-25 2082/week @ 2024-07-02 1540/week @ 2024-07-09 1442/week @ 2024-07-16 1712/week @ 2024-07-23 1853/week @ 2024-07-30 2332/week @ 2024-08-06

7,517 每月下载量

MIT/Apache

78KB
1.5K SLoC

解析和验证 Web 内容安全策略第 3 级

Crates.IO Requires rustc 1.70.0

此函数将 CSP 字符串解析成数据结构,并提供了一组函数,您可以在其上调用(基本上是 CSP 标准中定义的所有 "钩子")。它直接使用 url crate,但故意与您的 HTML 解析器和网络栈无关,因此它不做几件事情

  • 虽然这个库直接使用 rust-url,但它故意不与任何特定的网络栈、HTML 解析器或 DOM 实现纠缠。
  • 而不是像规范所说,直接将事件添加到事件循环中,它返回一个库用户应推送到事件循环的对象 Vec<>。只需遍历 vec,将其转换为您的内部事件表示形式,然后在调用 rust-content-security-policy 函数后将它们推送到事件循环。由于 CSP 规范在其算法的任何部分都不会旋转事件循环,所以这将始终符合规范。
  • 不操作解析的 CSP 数据结构任何部分的简单算法,如 is element nonceable,可能永远不会由这个库实现。用户将花费与直接实现该算法一样多的努力将 HTML 解析器的数据结构转换为 rust-content-security-policy 会接受的内容。

安装

要使用 content-security-policy,将其添加到项目的 Cargo.toml 文件中

[dependencies]
content-security-policy = "0.5.2"

示例

extern crate content_security_policy;
use content_security_policy::*;
fn main() {
    let csp_list = CspList::parse("script-src *.notriddle.com", PolicySource::Header, PolicyDisposition::Enforce);
    let (check_result, _) = csp_list.should_request_be_blocked(&Request {
        url: Url::parse("https://www.notriddle.com/script.js").unwrap(),
        origin: Origin::Tuple("https".to_string(), url::Host::Domain("notriddle.com".to_owned()), 443),
        redirect_count: 0,
        destination: Destination::Script,
        initiator: Initiator::None,
        nonce: String::new(),
        integrity_metadata: String::new(),
        parser_metadata: ParserMetadata::None,
    });
    assert_eq!(check_result, CheckResult::Allowed);
    let (check_result, _) = csp_list.should_request_be_blocked(&Request {
        url: Url::parse("https://www.evil.example/script.js").unwrap(),
        origin: Origin::Tuple("https".to_string(), url::Host::Domain("notriddle.com".to_owned()), 443),
        redirect_count: 0,
        destination: Destination::Script,
        initiator: Initiator::None,
        nonce: String::new(),
        integrity_metadata: String::new(),
        parser_metadata: ParserMetadata::None,
    });
    assert_eq!(check_result, CheckResult::Blocked);
}

依赖项

~4.5–6.5MB
~136K SLoC