#rocket-web #rocket #csrf #web-framework #web #security #rocket-framework

rocket_csrf_token

为 Rocket 网页框架提供 CSRF(跨站请求伪造)保护

5 个版本

0.3.5 2024年1月23日
0.3.4 2023年11月23日
0.3.3 2023年10月29日
0.3.2 2023年10月26日
0.3.1 2023年10月24日

#2162 in 网页编程

MIT 协议

28KB
234

rocket_csrf_token

rocket_csrf 的一个稍加维护的版本。

用法

fairing 附加到 Rocket 实例

#![feature(decl_macro)]

#[macro_use]
extern crate rocket;
#[macro_use]
extern crate serde_derive;

use rocket_dyn_templates::Template;

#[launch]
fn rocket() -> _ {
    rocket::build()
    .attach(rocket_csrf_token::Fairing::default())
    .attach(Template::fairing())
    .mount("/", routes![new, create])
}

您还可以配置 fairing

#[launch]
fn rocket() -> _ {
  rocket::build()
    .attach(
      rocket_csrf_token::Fairing::new(
        rocket_csrf_token::CsrfConfig
          ::default()
          .with_cookie_name("foobar")
          .with_cookie_len(64)
          .with_lifetime(Some(rocket::time::Duration::days(3)))
      )
    )
    .attach(Template::fairing())
    .mount("/", routes![new, create])
}

guard 添加到任何您想要访问会话 CSRF 令牌(例如,将其包含在表单中)或验证它(例如,验证表单)的请求中

use rocket::form::Form;
use rocket::response::Redirect;
use rocket_csrf_token::CsrfToken;
use rocket_dyn_templates::Template;

#[get("/comments/new")]
fn new(csrf_token: CsrfToken) -> Template {
  // your code
}

#[post("/comments", data = "<form>")]
fn create(csrf_token: CsrfToken, form: Form<Comment>) -> Redirect {
  // your code
}

guard 获取 CSRF 令牌以在 模板 中使用

#[get("/comments/new")]
fn new(csrf_token: CsrfToken) -> Template {
  let authenticity_token: &str = csrf_token.authenticity_token();

  // your code
}

模板 中将 CSRF 令牌添加到您的 HTML 表单

<form method="post" action="/comments">
  <input
    type="hidden"
    name="authenticity_token"
    value="{{ authenticity_token }}"
  />
  <!-- your fields -->
</form>

将属性 authenticity_token 添加到您的 表单

#[derive(FromForm)]
struct Comment {
  authenticity_token: String,
  // your attributes
}

验证 表单 以具有有效的真实性令牌

#[post("/comments", data = "<form>")]
fn create(csrf_token: CsrfToken, form: Form<Comment>) -> Redirect {
  if let Err(_) = csrf_token.verify(&form.authenticity_token) {
    return Redirect::to(uri!(new));
  }

  // your code
}

最小示例 中查看完整代码。

待办事项

  • 添加将验证所有请求的 fairing 作为选项。
  • 验证 X-CSRF-Token 标头。
  • 设置 cookie 与会话一起过期。
  • 添加 data guard 以使用 guard 验证表单。
  • 添加用于渲染表单字段的助手。
  • 添加用于为 Ajax 添加 HTML meta 标签的助手,并带有 X-CSRF-Token 标头(WIP)。
  • Ruby on Rails 中使用真实性令牌加密。
  • 允许配置 CSRF 保护(CSRF 令牌字节长度、cookie 名称等)。

依赖关系

~17–51MB
~823K SLoC