Gre*_*reg 3 security node.js cors
我不确定关于Access-Control-Allow-Origin和cookies等安全性的细节.
我试图生成一个允许从任何网站进行身份验证的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();
});
Run Code Online (Sandbox Code Playgroud)
将Access-Control-Allow-Origin响应头设置为请求的Origin头的值会出现什么问题?
这与允许原点完全相同,*并且不需要任何攻击者的额外努力.但是,您将能够以类似的方式解决此问题.如果您有一个预先批准的域名列表,您希望允许其访问,则可以从已发送的Origin标题中检查域名,如果它与允许的域名匹配,则可以Origin在内部进行反映Access-Control-Allow-Origin.
安全风险*在于它允许任何站点读取可能包含私有用户数据的内容.
当你允许任何域与凭据,请联系API(有效Access-Control-Allow-Origin: *和Access-Control-Allow-Credentials: true)你也允许其他域可能劫持数据.
例如,当您的受害者登录到您的API时,攻击者会向您的受害者发送一封电子邮件,以便在攻击者的域上查看有趣的视频www.evil.com.当cat视频正在播放时,攻击者域会向您的API发出AJAX请求www.example.com/Get_User_Profile_Details并读取用户的详细信息,包括DOB,家庭住址,电话号码和其他详细信息.暗示Access-Control-Allow-Origin: *并Access-Control-Allow-Credentials: true允许CORS在通常被同源策略阻止时检索此数据.
因此,为了防止这种情况,您应该只输出已Access-Control-Allow-Credentials批准域的标头.
我试图生成一个允许从任何网站进行身份验证的API.
如果你确实需要从任何网站访问,那么你需要小心.您可以Origin根据会话ID 存储初始身份验证请求(即用户输入其用户名和密码).在每个请求中,您都需要检查Origin并查看它是否与Origin服务器端会话中存储的匹配.如果是这样,您输出Access-Control-Allow-Origin: https://www.foo.com标题(假设www.foo.com是用户登录的位置),如果不是,则根本不输出Access-Control-Allow-Origin.
您可能还会发现这篇文章很有趣.