这是防止跨站点请求伪造 (CSRF) 攻击的安全方法吗?

Is this a secure way to prevent Cross-site Request Forgery (CSRF) attacks?

我们的应用程序是这样的:

通常我们会发送一个 sessionid cookie 和一个 csrftoken cookie。令牌 cookie 值将作为 x-header 包含在任何 AJAX post 中,并且每个请求都会在服务器上验证所有内容。

由于 SPA 页面是在将其返回到浏览器之前构建的,因此我们可以在其中嵌入任何我们喜欢的内容。我们希望最终用户能够登录多个选项卡,一个不影响其他。

我们更愿意做的事情:

这让我们有机会允许多次登录,每次登录都有一个唯一的 sessionid cookie 名称,但每个 post 请求都有一个标准化的 x-header 名称。

这会像 sessionid cookie、csrftoken cookie/x-header 方法一样安全吗?

是的,添加攻击者无法从有效用户的 session 复制的 header 是一种方法。

例如X-Requested-With 可以添加到每个 AJAX 请求(JQuery 默认情况下这样做),您只需检查服务器端收到请求时是否存在此 header。如果服务器未通过 CORS 选择加入,则无法发送此 header cross-domain。

您可以将其与令牌组合 - see my answer here

例如

X-Requested-With: XMLHttpRequest;0123456789ABCDEF