#security-policy #security #csp #json #content-security

csp_generator

消耗一个以 JSON 格式化的域名列表和 CSP 指令,并输出正确格式的内容安全策略字符串

10 个版本

0.2.0-rc2020 年 5 月 10 日
0.2.0-beta.32020 年 5 月 5 日
0.2.0-beta.22020 年 4 月 30 日
0.1.0-rc.12020 年 3 月 24 日

#3 in #csp

MIT 许可证

23KB
405 代码行数(不含注释)

Actions Status Crates.io codecov

内容安全策略生成器

管理和创建内容安全策略可能是一个挑战。内容安全策略头格式不利于跨多个指令管理大量域名。特别是如果您需要允许 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

作者

@RobDWaller

依赖项

~0.7–1.4MB
~33K SLoC