我正在使用lusca处理我的应用程序的csrf攻击.在我的快递应用程序中,当我渲染一个html页面并将_csrf标记传递给它以放置一个隐藏的输入时,一切都是正确的,因为lusca检查html _csrf标记并找到匹配.
我的控制器:
response.render("root/home", {
_csrf: response.locals._csrf
});
Run Code Online (Sandbox Code Playgroud)
我的html页面:
<input type="hidden" name="_csrf" value="{{_csrf}}" />
Run Code Online (Sandbox Code Playgroud)
但是当我想为POST请求导出json响应时,我无法发送我的_csrf令牌,因此lusca无法找到匹配项(我认为问题在这里)并给我这个错误:
错误:CSRF令牌不匹配
我的控制器:
response.json({
status: "success"
});
Run Code Online (Sandbox Code Playgroud)
更新:
该CSRF秘(不令牌,你要知道)被再生或删除初始的某个时候GET和POST.唯一可行的方法是在请求之间更改或删除会话中存储为_csrfSecret的值.确保您的会话正常运行. 从这个来源
但我仍然无法找到解决方案!
更新2:
我们有2个生成csrf令牌的策略... 每个会话和每个请求.在我的应用程序令牌生成每个请求.问题是当我第一次请求新令牌和秘密时会生成.它意味着新的令牌和秘密是匹配的.但是当我保存令牌并用ajax请求发送它时(在标题或正文中); 这个ajax请求使旧秘密过期并生成一个新秘密.所以我的令牌不符合它.