10 个版本
0.2.0-rc | 2020 年 5 月 10 日 |
---|---|
0.2.0-beta.3 | 2020 年 5 月 5 日 |
0.2.0-beta.2 | 2020 年 4 月 30 日 |
0.1.0-rc.1 | 2020 年 3 月 24 日 |
#3 in #csp
23KB
405 代码行数(不含注释)
内容安全策略生成器
管理和创建内容安全策略可能是一个挑战。内容安全策略头格式不利于跨多个指令管理大量域名。特别是如果您需要允许 Google Analytics。
这个 Rust 库允许您从组织良好的 JSON 字符串生成 CSP 头部字符串。该库接受的 JSON 结构允许您更轻松地管理网站 CSP 策略的许多域名和许多指令。
如果您需要了解更多关于内容安全策略的信息,我们建议您阅读以下资源
安装
要在 Rust 项目中安装 csp_generator,只需将其添加到 Cargo 清单中的依赖项即可。
示例 Cargo.toml
[dependencies]
csp_generator = "0.2.0-beta.3"
用法
此库公开了三种方法
csp_generator::enforce()
csp_generator::report_only()
csp_generator::csp_only()
“enforce” 和 “report_only” 方法将返回一个包含头字符串和 CSP 字符串的结构。这将确保您根据是否希望使用强制执行或仅报告模式拥有正确的 CSP 头部和 CSP 指令字符串。
如果您只想返回 CSP 指令字符串,请调用 “csp_only” 方法。
每个方法都接受两个参数:您希望使用的 CSP 指令列表和 JSON 配置。如果您愿意,可以使用内置的 CSP 指令列表配置,因为它包含所有标准 CSP 指令,请参阅 csp_generator::config
。但是,由于此功能符合接口,它可以被覆盖。
示例代码
use csp_generator::{directives, Csp};
fn main() {
let json = r#"
[
{"domain": "example.com", "directives": ["connect-src"]},
{"domain": "test.com", "directives": ["connect-src", "script-src"]}
]
"#;
let csp: Csp = csp_generator::enforce(directives::directives(), json);
println!("This is the CSP Header: {}", csp.header);
// This is the CSP Header: Content-Security-Policy
println!("This is the CSP Directives String: {}", csp.csp);
// This is the CSP Directives String: script-src test.com; connect-src example.com test.com;
}
JSON 配置
此库依赖于特定的 JSON 格式。这是一个包含两个属性的对象数组。属性 domain
是一个字符串,属性 directive
是指令字符串数组。
格式
[
{"domain": string, "directive": array<string>}
]
示例配置 在此示例中,我们将 example.com 与 connect-src 指令相关联,将 test.com 域与 connect-src 和 script-src 指令相关联。
[
{"domain": "example.com", "directive": ["connect-src"]},
{"domain": "test.com", "directive": ["connect-src", "script-src"]}
]
CSP 指令列表
除了以 JSON 格式提供域名和指令列表外,我们还需要向 csp_generator 提供我们希望在 CSP 中使用的指令列表。
您可以使用构建CSP指令列表配置,因为它包含所有标准CSP指令的列表。但如果你希望覆盖它,也可以。
您只需遵守csp_generator::directives::GetDirectives
特质(接口)。
示例覆盖 此覆盖将生成一个只使用script-src和connect-src的CSP指令字符串。
use csp_generator::directives::GetDirectives;
use csp_generator::Csp;
pub struct MyDirectives {
list: Vec<String>,
}
impl GetDirectives for MyDirectives {
fn get_directives(&self) -> Vec<String> {
self.list.clone()
}
}
// Construct MyDirectives Struct with the directives you wish to use.
fn my_directives() -> MyDirectives {
MyDirectives {
list: vec![
String::from("script-src"),
String::from("connect-src"),
],
}
}
pub fn main() {
let json = r#"
[
{"domain": "example.com", "directives": ["connect-src"]},
{"domain": "test.com", "directives": ["connect-src", "img-src"]}
]
"#;
let csp: Csp = csp_generator::report_only(my_directives(), json);
println!("This is the CSP Header: {}", csp.header);
// This is the CSP Header: Content-Security-Policy-Report-Only
println!("This is the CSP Directives String: {}", csp.csp);
// This is the CSP Directives String: connect-src example.com test.com;
}
许可证
MIT
作者
依赖项
~0.7–1.4MB
~33K SLoC