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