9个版本 (5个重大更改)

0.7.0 2022年9月4日
0.6.1 2022年5月25日
0.6.0 2022年4月10日
0.5.0 2022年2月27日
0.2.2 2021年8月19日

#838HTTP服务器

Download history 41/week @ 2024-03-14 20/week @ 2024-03-21 36/week @ 2024-03-28 57/week @ 2024-04-04 54/week @ 2024-04-11 29/week @ 2024-04-18 18/week @ 2024-04-25 8/week @ 2024-05-02 17/week @ 2024-05-16 70/week @ 2024-05-23 57/week @ 2024-05-30 624/week @ 2024-06-06 2901/week @ 2024-06-13 4324/week @ 2024-06-20 3152/week @ 2024-06-27

每月11,007 次下载

MIT/Apache

45KB
770

actix-csrf

适用于Actix-web 4.0.0或更高版本的CSRF中间件,使用双提交令牌模式。

此crate尚未经过审计。请在生产中使用时自行承担风险。

使用方法

安装中间件是标准的:指定要使用的加密安全RNG,并声明哪些路径应设置CSRF cookie以及何时应验证CSRF cookie。

#[actix_web::main]
async fn main() -> std::io::Result<()> {
    HttpServer::new(|| {
        let csrf = Csrf::<StdRng>::new()
            .set_cookie(Method::GET, "/login");
        App::new().wrap(csrf).service(login_ui).service(login)
    })
    .bind(("127.0.0.1", 8080))?
    .run()
    .await
}

然后,使用CsrfCookie提取器提取CSRF cookie,并用作为受保护请求一部分提供的CSRF令牌进行验证。

#[derive(Deserialize)]
struct LoginForm {
    csrf_token: CsrfToken,
    username: String,
    password: String,
}

impl CsrfGuarded for LoginForm {
    fn csrf_token(&self) -> &CsrfToken {
        &self.csrf_token
    }
}

/// Validates a login form that has a CSRF token.
#[post("/login")]
async fn login(form: Csrf<Form<LoginForm>>) -> impl Responder {
    // At this point, we have a valid CSRF token, so we can treat the request
    // as legitimate.

    HttpResponse::Ok().finish()
}

这仅是使用双提交令牌模式的一种方式;有关更多信息,请参阅文档示例

安全考虑

使用双提交令牌模式有优点和局限性。强烈建议用户在开始使用此中间件之前阅读Owasp关于CSRF保护的文章

此crate尝试设置安全的默认值,并且用户必须明确禁用深度防御功能。

许可协议

以下任一许可协议下授权:

根据您的选择。

贡献

除非您明确声明,否则根据Apache-2.0许可协议定义,您有意提交给作品的所有贡献都应按上述方式双授权,无需任何额外条款或条件。

依赖关系

~15–28MB
~467K SLoC