如何解决Cors 标头未使用 Actix_Cors 设置,使用以 Rust 编写的 Actix_Web 服务器
我使用 Actix_Web 在 Rust 中编写了一个 Web 服务器。我正在为生产做准备,所以我想将 Cors 添加到服务器以提高安全性。我已经使用 Actix_Cors 包来做到这一点,并使用基本服务器进行了测试。然而,在调用端点时,Cors 标头未设置,服务器接受来自任何客户端的连接,即使我已将其限制为不应该工作的域。我不确定为什么这不起作用,并已尽我所能对其进行调试。我严格按照 Actix-Cors 文档中的说明设置我的服务器。有人能帮我弄清楚为什么它不起作用吗?
主要功能:
use actix_cors::Cors;
use actix_web::{get,http,web,App,HttpRequest,HttpResponse,HttpServer};
#[get("/index.html")]
async fn index(req: HttpRequest) -> &'static str {
"<p>Hello World!</p>"
}
#[actix_web::main]
async fn main() -> std::io::Result<()> {
HttpServer::new(|| {
let cors = Cors::default()
.allowed_origin("https://www.rust-lang.org/")
.allowed_origin_fn(|origin,_req_head| origin.as_bytes().ends_with(b".rust-lang.org"))
.allowed_methods(vec!["GET","POST"])
.allowed_headers(vec![http::header::AUTHORIZATION,http::header::ACCEPT])
.allowed_header(http::header::CONTENT_TYPE)
.max_age(3600);
App::new().wrap(cors).service(index)
})
.bind(("127.0.0.1",8080))?
.run()
.await;
Ok(())
}
我的cargo.toml 是:
[dependencies]
actix-cors = "0.5.4"
actix-web = "3.3.2"
GET /index.html HTTP/1.1
Accept: */*
Accept-Encoding: gzip,deflate
Connection: keep-alive
Host: localhost:8080
User-Agent: HTTPie/2.4.0
HTTP/1.1 200 OK
content-length: 19
content-type: text/plain; charset=utf-8
date: Tue,04 May 2021 07:47:02 GMT
<p>Hello World!</p>
感谢您的帮助。
解决方法
我认为您将授权与 CORS 混合使用。 CORS 并不意味着您无法直接访问该页面,它意味着如果您正在访问站点 A,并且在站点 A 中,某些 javascript 正在尝试访问站点 B 上的某些资源,浏览器将决定您是否可以访问站点B 基于 CORS 设置。
就您而言,您允许“https://www.rust-lang.org”访问您的网站 (http://127.0.0.1/index.html)。这意味着如果“https://www.rust-lang.org”以某种方式想要使用 javascript 代码来访问您的本地站点,浏览器将允许它这样做。但在实践中,rust-lang.org 几乎不会尝试访问你的本地主机,所以这只是一个纯粹的 actix cors 代码示例。
我认为您正在寻找的是授权中间件,CORS 不符合您的目的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。