我不确定关于Access-Control-Allow-Origin和cookies等安全性的细节。
我试图制作一个允许来自任何网站进行身份验证的API。因此,我需要设置:
Access-Control-Allow-Origin
至*
和
Access-Control-Allow-Credentials
至true
由于安全限制,这是不允许的。
但是,将Access-Control-Allow-Origin
响应标头设置为请求的Origin
标头的值会出现什么问题?这是一个巨大的安全漏洞吗?!
e.g。 (节点)
// 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();
});
答案 0 :(得分:5)
将Access-Control-Allow-Origin响应标头设置为请求的Origin标头的值会出现什么问题?
这与允许原点*
完全相同,并且不需要任何攻击者的额外努力。但是,您将能够以类似的方式解决此问题。如果您有一个预先批准的允许访问的域列表,则可以在已发送的Origin
标头中检查域名,如果它与允许的域名匹配,则可以在内部反映Origin
Access-Control-Allow-Origin
。
*
的安全风险是,它允许任何网站读取可能包含私人用户数据的内容。
由于您允许任何域名使用凭据(有效Access-Control-Allow-Origin: *
和Access-Control-Allow-Credentials: true
)与您的API联系,因此您还允许其他域可能劫持数据。
例如,当受害者登录到您的API时,攻击者会向您的受害者发送一封电子邮件,以便在攻击者的域www.evil.com
上查看有趣的视频。当cat视频正在播放时,攻击者域会在www.example.com/Get_User_Profile_Details
向您的API发出AJAX请求,并读取用户的详细信息,包括DOB,家庭住址,电话号码和其他详细信息。隐含的Access-Control-Allow-Origin: *
和Access-Control-Allow-Credentials: true
将允许CORS在Same Origin Policy正常阻止时检索此数据。
因此,为防范这种情况,您只应为已批准的域名输出Access-Control-Allow-Credentials
标题。
我试图制作一个允许来自任何网站进行身份验证的API。
如果您确实需要访问任何网站,那么您需要小心。您可以根据会话ID存储初始身份验证请求的Origin
(即用户输入其用户名和密码)。在每个请求中,您需要检查Origin
并查看它是否与服务器端会话中存储的Origin
匹配。如果是这样,您输出Access-Control-Allow-Origin: https://www.foo.com
标题(假设www.foo.com
是用户登录的位置),如果不是,则根本不输出Access-Control-Allow-Origin
。
您可能还会找到this post interesting。
答案 1 :(得分:0)
我不是这些事情的专家......
我建议原则上它不仅仅是“*”,因为它需要一些努力让调用者放入他们想要的任何东西。
我建议如果你真的想把事情搞定(对于已批准的[API?]用户),那就是在配置中保留原点并每次检查?
正如我所说,我不是专家。
为了记录,格雷格在工作中坐在我对面..我可以和他聊聊我的观点,但我想要点数: - )