我不确定关于Access-Control-Allow-Origin和Cookie等方面的安全性方面的要点。
我试图生成一个API,该API允许从任何网站进行身份验证。因此,我需要设置:
Access-Control-Allow-Origin
到*
和
Access-Control-Allow-Credentials
到 true
由于安全限制,不允许这样做。
但是,将Access-Control-Allow-Origin
响应标Origin
头设置为请求标头的值会有什么问题呢?那是一个巨大的安全漏洞吗?
例如(节点)
// 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的“默认”会话管理方法,则Access-Control-Allow-Origin和Access-Control-Allow-Credentials标头组合可能会对您的站点造成风险。例如,如果会话是通过Cookie(常见),基本/ NTLM / Kerberos身份验证(发生)或客户端证书(非常罕见)来维护的。
如果您使用Authentication: Bearer
标头或类似标题,而浏览器不会自动发送会话令牌,那么这可能不会成为问题(除非您也接受其他方法,并且您的合法用户使用这些方法)。
将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
。在播放猫视频时,攻击者域会在处向您的API发出AJAX请求,www.example.com/Get_User_Profile_Details
并读取用户的详细信息,包括DOB,家庭住址,电话号码和其他详细信息。隐含Access-Control-Allow-Origin: *
且Access-Control-Allow-Credentials: true
将允许CORS在通常被Same Origin Policy阻止的情况下检索此数据。
因此,为防止这种情况,您应该仅输出已Access-Control-Allow-Credentials
批准域的标头。
我试图生成一个API,该API允许从任何网站进行身份验证。
如果实际上您确实需要从任何网站访问,那么您将需要小心。您可以Origin
根据会话ID存储初始身份验证请求(即用户输入其用户名和密码)的。在每个请求上,您都需要检查Origin
和,看是否与Origin
针对服务器端会话存储的内容相匹配。如果是这样,您将输出Access-Control-Allow-Origin: https://www.example.org
标头(假设www.example.org
是用户登录的位置),否则,您将不会输出Access-Control-Allow-Origin
。
您可能还会发现这篇文章很有趣。
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다