7 个不稳定版本 (3 个破坏性更改)
| 0.3.0 | 2021 年 3 月 6 日 | 
|---|---|
| 0.2.0 | 2020 年 10 月 18 日 | 
| 0.1.1 | 2020 年 10 月 17 日 | 
| 0.0.2 | 2020 年 10 月 16 日 | 
在 #csrf 中排名 8
10KB
128 行代码(不包括注释)
rocket_csrf
为 Rocket 网页框架提供 CSRF (跨站请求伪造) 保护。
警告! 现在的实现非常简单,可能不适合生产环境。
关于 Rocket 中 CSRF 护理的讨论 在这里。
目录
用法
将 公平 添加到 Rocket 实例
#![feature(decl_macro)]
#[macro_use] extern crate rocket;
#[macro_use] extern crate serde_derive;
use rocket_contrib::templates::Template;
fn main() {
    rocket::ignite()
        .attach(rocket_csrf::Fairing::default())
        .attach(Template::fairing())
        .mount("/", routes![new, create])
        .launch();
}
将 守卫 添加到任何您希望访问会话 CSRF 令牌的请求中(例如,将其包含在表单中)或验证它(例如,验证表单)
use rocket::response::Redirect;
use rocket::request::Form;
use rocket_contrib::templates::Template;
use rocket_csrf::CsrfToken;
#[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
}
#[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
}
在 最小示例 中查看完整代码。
待办事项
- 作为选项添加验证所有请求的公平性。
- 添加 数据守卫 以验证带有守卫的表单。
- 添加用于渲染表单字段的助手。
- 添加用于为 Ajax 添加 HTML meta 标签的助手 X-CSRF-Token标题。
- 验证 X-CSRF-Token标题。
- 使用来自 Ruby on Rails 的真实性令牌加密。
- 允许配置 CSRF 保护(CSRF 令牌字节长度、cookie 名称等)。
- 设置 cookie 以与会话一起过期。
依赖关系
~11MB
~225K SLoC