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 网络编程
7,517 每月下载量
78KB
1.5K SLoC
解析和验证 Web 内容安全策略第 3 级
此函数将 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