2个版本
0.1.1 | 2021年9月6日 |
---|---|
0.1.0 | 2021年8月12日 |
#900 在 HTTP服务器
每月107 次下载
40KB
580 行
tide-csrf
为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方法。这些“不安全”的方法是 POST
、PUT
、PATCH
和 DELETE
。其余方法(如 GET
、HEAD
等)默认情况下不受保护。这限制了中间件对应用程序性能的影响。
但是,如果您的应用程序在那些“安全”方法中更改状态,则需要设置受保护方法的列表以包括这些其他方法。
请注意,保护 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版 (LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证 (LICENSE-MIT 或 https://opensource.org/licenses/MIT)
任选其一。
贡献
除非您明确表示,否则您根据Apache-2.0许可证定义的任何有意提交以包含在作品中的贡献,均应按上述方式双许可,不附加任何额外条款或条件。
依赖项
~13–25MB
~377K SLoC