我有一个客户端应用程序(用Angularjs编写)和一个客户端使用的api。 api使用会话cookie进行身份验证(不要问为什么,我无法更改)。
我正在尝试实现每个请求csrf令牌生成。通常,如果我有服务器端html渲染,我会为每个表单生成一个csrf标记作为隐藏输入。
使用客户端Javascript应用程序执行此操作的最佳方法是什么?我想创建一个api端点,如果用户通过身份验证,则会生成一个csrf令牌,获取该令牌并使用post请求提交它。但我不确定这是否真的是安全的。有什么想法吗?
我知道每个请求或每个会话有很多关于csrf令牌的论据。我试图弄清楚实现这种特定机制的最佳方法是什么,而不会造成更多漏洞;这是使用client-api设置的每个请求的csrf令牌。
答案 0 :(得分:0)
我有一个解决方案,我将回答我自己的问题。如果您认为这种方法存在任何潜在的危险或缺陷,请发布您的答案,如果您有更好的解决方案或评论。
所以,我认为我可以做的是在api上创建一个响应过滤器,并为当前会话的每个响应发送一个新的csrf标记作为自定义响应标头。
在客户端,我可以创建一个http响应拦截器来存储这个csrf令牌和一个请求拦截器,将这个令牌添加为自定义的csrf头,以便发送回api。
也可以在每个请求(SET-COOKIE标题)上将其设置为cookie,并让浏览器处理此问题(如果设置了Cookie XSRF-TOKEN,则在Angular中设置$ http服务将自动将其作为X-XSRF-TOKEN发送http标题)。但如果打开多个标签,这将导致无效的csrf问题。