规范建议使用state
参数来帮助缓解CSRF-lie攻击向量。但是,如果使用基于令牌的身份验证而不是基于会话的身份验证为用户的用户实现身份验证工作流程,那么考虑到无法在会话上设置状态,将建议管理状态。
答案 0 :(得分:0)
CSRF涉及基于浏览器的用户代理。 state
应以加密方式绑定到用户代理。由于将绑定存储在基于浏览器的用户代理可用的请求/响应对上的唯一机制是cookie或HTML存储,因此您只能使用这些选项。
答案 1 :(得分:0)
我意识到你的问题明确地要求没有cookie ,但是既然你说明你的目标是避免后端会话,你可以向浏览器发出一个包含状态的短期签名cookie。通过签名,你知道你发了它,它没有被篡改。使它具有良好的安全性和安全性。
我目前正在使用Express.js尝试以下内容:
const cookieParser = require('cookie-parser');
...
app.use(cookieParser('your-secret'));
在生成重定向到授权服务器的后端代码中,我将状态存储在已签名的cookie中,并将其包含在授权服务器的重定向URL中:
const state = uuidv4();
res.cookie(
'state',
state,
{
maxAge: 60 * 1000,
httpOnly: true,
secure: true,
signed: true // important
}
);
然后在你的回调处理程序中,验证cookie状态(req.signedCookies.state
)是否与查询字符串参数状态(req.query.state
)匹配,然后可选择删除cookie或让它自己过期。
即使spec说这种方法(“将此参数的值与浏览器cookie加密地加密”)是“典型的”,但我很难找到任何人这样做。我确实发现mod_auth_openidc听起来像是在做这个,但我没有深入研究它的来源:
一个短暂的“状态”cookie,用于关联身份验证请求和响应
你问过这已经过去了一年,如果你找到另一种解决方法,我很乐意听到它。