gpt4 book ai didi

node.js - CORS 安全 : Set Access-Control-Allow-Origin to Origin on Request Header

转载 作者:搜寻专家 更新时间:2023-10-31 23:38:35 25 4
gpt4 key购买 nike

我不确定在 Access-Control-Allow-Origin 和 cookie 等方面的安全细节。

我试图制作一个允许从任何网站进行身份验证的 API。因此我需要设置:

Access-Control-Allow-Origin*

Access-Control-Allow-Credentialstrue

由于安全限制,这是不允许的。

但是,将 Access-Control-Allow-Origin 响应 header 设置为请求的 Origin header 的值会出现什么问题?这是一个巨大的安全漏洞吗?!

例如( Node )

// CORS
app.all('*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', req.headers.origin);
res.header('Access-Control-Allow-Headers', 'origin, content-type, accept');
res.header('Access-Control-Allow-Credentials', 'true');
res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS');

if (req.method == 'OPTIONS') {
res.status(200).end();
}

next();
});

最佳答案

如果您接受 API 的“默认” session 管理方法,Access-Control-Allow-Origin 和 Access-Control-Allow-Credentials header 组合可能会给您的网站带来风险。例如,如果 session 是通过 cookie(常见)、basic/NTLM/Kerberos 身份验证(发生)或客户端证书(非常罕见)维护的。

如果您使用 Authentication: Bearer header 或类似 header ,浏览器不会自动发送 session token ,那么这可能不会成为问题(除非您也接受其他方法,并且您的合法用户使用这些)。

What would be the problem with setting the Access-Control-Allow-Origin response header to the value of the Origin header of the request?

这与允许来源 * 完全相同,并且不需要任何攻击者的额外努力。但是,您将能够以类似的方式解决此问题。如果您有一个预先批准的域列表,您希望允许访问,您可以从发送的 Origin header 中检查该域,如果它与允许的匹配,您可以反射(reflect) Access-Control-Allow-Origin 中的 Origin

* 的安全风险在于它将允许任何站点 读取可能包含私有(private)用户数据的内容。

因为您允许任何域使用凭据联系您的 API(有效 Access-Control-Allow-Origin: *Access-Control-Allow-Credentials: true ) 您还允许其他域可能劫持数据。

例如,当您的受害者登录到您的 API 时,攻击者伪造了一封电子邮件给您的受害者,让他们去观看攻击者域 www.evil.com 上的有趣视频。在播放猫视频时,攻击者域向位于 www.example.com/Get_User_Profile_Details 的 API 发出 AJAX 请求,并读取用户的详细信息,包括出生日期、家庭住址、电话号码和其他详细信息。隐含的 Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true 将允许 CORS 在通常被Same Origin Policy .

因此,为了防止这种情况发生,您应该只为已批准的域输出 Access-Control-Allow-Credentials header 。

I was trying to produce an API that allowed authentication from any website.

如果您确实需要从任何 网站访问,那么您需要小心。您可以根据 session ID 存储初始身份验证请求(即用户输入用户名和密码)的 Origin。对于每个请求,您都需要检查 Origin 并查看它是否与针对服务器端 session 存储的 Origin 匹配。如果是这样,您输出 Access-Control-Allow-Origin: https://www.example.org header (假设 www.example.org 是用户登录的位置) 如果不是,则根本不输出 Access-Control-Allow-Origin

您还可以找到 this post interesting .

关于node.js - CORS 安全 : Set Access-Control-Allow-Origin to Origin on Request Header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25429411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com