#csrf #tide #security #request-headers #query-parameters #csrf-token

tide-csrf

为Tide提供的跨站请求伪造(CSRF)保护中间件

2个版本

0.1.1 2021年9月6日
0.1.0 2021年8月12日

#900HTTP服务器

Download history 2/week @ 2024-03-26 32/week @ 2024-04-02

每月107 次下载

MIT/Apache

40KB
580

tide-csrf

Build Status Latest version Documentation License Contributor Covenant

为Tide提供的跨站请求伪造(CSRF)保护中间件。

此crate提供中间件,帮助您防御CSRF攻击。中间件生成CSRF cookie并将其添加到您的Tide响应中,然后生成CSRF令牌并将其提供给您的Tide请求。在您的HTML中,您需要安排将CSRF令牌返回到服务器,以便在后续请求中返回。CSRF令牌可以放在请求头、查询参数或表单字段中。中间件将在收到对受保护方法的请求时验证CSRF令牌的存在和有效性。

用法

将此内容添加到您的 Cargo.toml

[dependencies]
tide-csrf = "0.1"

示例

use tide_csrf::{self, CsrfRequestExt};

let mut app = tide::new();

app.with(tide_csrf::CsrfMiddleware::new(
    b"we recommend you use std::env::var(\"TIDE_SECRET\").unwrap().as_bytes() instead of a fixed value"
));

// This is an unprotected method and does not require a CSRF token
// (but will set the CSRF cookie).
app.at("/").get(|req: tide::Request<()>| async move {
    // Note that here we are simply returning the token in a string, but
    // in a real application you need to arrange for the token to appear
    // in the request to the server.
    Ok(format!(
        "CSRF token is {}; you should return that in header {}, or query param {}, or a form field named {}",
        req.csrf_token(),
        req.csrf_header_name(),
        req.csrf_query_param(),
        req.csrf_field_name()
    ))
});

// This is a protected method and will only allow the request to
// make it to the handler if the CSRF token is present in the
// request. Otherwise an HTTP status of `Forbidden` will be
// returned and the handler will *not* be called.
app.at("/").post(|req: tide::Request<()>| async move {
   Ok("Getting this far means that the CSRF token was present in the request.")
});

受保护的方法

默认情况下,此中间件仅保护可能更改服务器状态的HTTP方法。这些“不安全”的方法是 POSTPUTPATCHDELETE。其余方法(如 GETHEAD 等)默认情况下不受保护。这限制了中间件对应用程序性能的影响。

但是,如果您的应用程序在那些“安全”方法中更改状态,则需要设置受保护方法的列表以包括这些其他方法。

请注意,保护 GET 可能会创建一个“鸡生蛋”的情况,您无法将CSRF cookie和令牌返回给调用者,以便它们在后续请求中返回给您!通常,默认方法列表是正确的,您应该确保“安全”方法确实是安全的并且不执行任何更改。

性能考虑

此中间件为每个请求添加一个CSRF cookie,并在处理受保护方法的请求时查找匹配的CSRF令牌。令牌可以返回在HTTP头、URL查询字符串或 application/x-www-form-urlencoded 表单体中。按此顺序搜索令牌,并在找到令牌时终止搜索。

搜索令牌最有效的地方是HTTP头中,如果您有能力在请求中设置头,则应优先考虑此机制。如果无法设置HTTP头,查询字符串是一个不错的选择。

使用表单字段是返回CSRF令牌效率最低的方式,因为中间件必须读取并反序列化整个请求体以检查令牌是否存在,然后为您的应用程序创建一个完整的内存副本。Tide请求体通常以流的形式发送到应用程序,因此与正常的请求流程相比,执行此额外的反序列化和内存复制步骤的成本相当高。

因此,中间件最后搜索表单字段,并且仅考虑application/x-www-form-urlencoded请求;可能包含大二进制负载的multipart/form-data正文不会被搜索。如果您需要保护multipart/form-data请求,则应在HTTP头或查询字符串中返回CSRF令牌。

行为

本项目遵守贡献者行为准则。该准则描述了所有贡献者应遵守的最基本行为。

许可证

根据您的要求,许可协议为以下之一

任选其一。

贡献

除非您明确表示,否则您根据Apache-2.0许可证定义的任何有意提交以包含在作品中的贡献,均应按上述方式双许可,不附加任何额外条款或条件。

依赖项

~13–25MB
~377K SLoC