我目前正在构建一个带有 JavaScript/HTML 前端的单页应用程序。前端调用用 .NET 编写的 WEB API。目前我有一个 HTML 页面,用户在其中输入他们的凭据并单击登录。然后将 AJAX 请求发送到 WEB API,该 API 对用户进行身份验证并返回包含 Json Web 令牌的 HTTP-Only cookie。然后浏览器在每个后续请求中发送此 cookie,控制器对其进行验证。
以上运行良好,但缺少 CSRF 保护。我试图找出实现这一点的最佳方法。根据我的研究,看起来有几个选择。
https://www.jamesward.com/2013/05/13/securing-single-page-apps-and-rest-services上的文章建议从 cookie 中提取令牌,然后将其作为请求标头提交。为此,我需要删除 HTTP-Only 标志,以便 JavaScript 可以访问 cookie。我认为这不是最好的解决方案,因为如果发现 XSS 漏洞,它可能会暴露会话信息。有什么我想念的吗?
我在其他地方读到过发送一个包含 CSRF 令牌的单独 cookie 并使用 JavaScript 从中提取值。然后在后续的 AJAX 请求中将该值作为自定义标头发送,并让 WEB API 基于该标头进行验证。我为此编写了一个快速的概念验证应用程序,并发现浏览器仍会在未来的请求中发送 CSRF 令牌所传递的 cookie。这会造成问题吗?带有 CSRF 攻击的页面能否以某种方式利用这一点?
与上面类似,但不是通过 cookie 传递 CSRF 令牌,而是通过自定义标头传递它,并让 JavaScript 从那里读取它。这似乎是最直接的方法,但是您看到这种方法有什么缺点吗?
此外,在用户的整个会话中继续使用单个 CSRF 令牌是否安全,或者是否应该在每次请求时刷新它?