这是防止跨站点请求伪造 (CSRF) 攻击的安全方法吗?
Is this a secure way to prevent Cross-site Request Forgery (CSRF) attacks?
我们的应用程序是这样的:
- 每个用户都必须登录
- 登录页面 posts 返回服务器,如果授权用户返回 SPA 应用程序。
- SPA 应用完全 AJAX
- HTTPS
通常我们会发送一个 sessionid
cookie 和一个 csrftoken
cookie。令牌 cookie 值将作为 x-header 包含在任何 AJAX post 中,并且每个请求都会在服务器上验证所有内容。
由于 SPA 页面是在将其返回到浏览器之前构建的,因此我们可以在其中嵌入任何我们喜欢的内容。我们希望最终用户能够登录多个选项卡,一个不影响其他。
我们更愿意做的事情:
- 像以前一样将 sessionid 作为 cookie 发送,但 cookie 名称是随机的。
- 没有 csrftoken,而是将随机 cookie 名称嵌入 javascript 例程中,该例程将 x-header 添加到 AJAX post 请求中。
- 服务器将从 x-header 中获取 sessionid。
这让我们有机会允许多次登录,每次登录都有一个唯一的 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
我们的应用程序是这样的:
- 每个用户都必须登录
- 登录页面 posts 返回服务器,如果授权用户返回 SPA 应用程序。
- SPA 应用完全 AJAX
- HTTPS
通常我们会发送一个 sessionid
cookie 和一个 csrftoken
cookie。令牌 cookie 值将作为 x-header 包含在任何 AJAX post 中,并且每个请求都会在服务器上验证所有内容。
由于 SPA 页面是在将其返回到浏览器之前构建的,因此我们可以在其中嵌入任何我们喜欢的内容。我们希望最终用户能够登录多个选项卡,一个不影响其他。
我们更愿意做的事情:
- 像以前一样将 sessionid 作为 cookie 发送,但 cookie 名称是随机的。
- 没有 csrftoken,而是将随机 cookie 名称嵌入 javascript 例程中,该例程将 x-header 添加到 AJAX post 请求中。
- 服务器将从 x-header 中获取 sessionid。
这让我们有机会允许多次登录,每次登录都有一个唯一的 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