为交叉源处理 Angular 2 个 csrf
Handling Angular 2 csrf for cross origins
下面是我们应用程序的架构。
- Web 界面 [客户端] 是独立的 Angular 2 应用程序 [domain.com]
- 持有客户端凭证的[代理][网络界面秘密][domain2.com]
- [API]本身有认证服务器[domain3.com]
申请流程如下:
- 用户在[客户端]登录页面输入他的凭证用户名+密码,然后将其发送到[代理]。
- 然后代理会将凭据附加到请求并将其转发到 [API].
- [API] 将能够在验证用户凭据后获得访问+刷新令牌 & return 它到 [代理]
- [proxy] return 响应连同 header [Set-Cookie:XSRF-TOKEN ]
- [client] 应该能够读取 [XSRF-TOKEN] 并将其作为 [X-XSRF-TOKEN] header.
除第 5 步外,在身份验证服务器、代理和客户端上一切正常:
Angular 应该能够根据文档自动处理这个问题
{ provide: XSRFStrategy, useValue: new CookieXSRFStrategy('XSRF-TOKEN', 'X-CSRF-TOKEN')}
哪里 angular 将能够获取 [XSRF-TOKEN] cookie 的值并创建 [X-CSRF-TOKEN] header 以及我们通过应用程序提出的每个请求。
虽然 & 当我使用不同的来源构建架构时,angular 无法从另一个来源读取 cookie。
我面临的这种方法的问题是,由于服务器位于不同的域中,我无法通过 XSRFStrategy 提供程序读取 cookie。有没有办法读取该 cookie 的值?
如果不是,那么当前架构是错误的&我需要在同一个架构中构建[client] & [proxy]我避免使用这种方法的域,因为我需要将表示层与任何后端代码分开。
所以,我的问题是如何针对这种情况实施csrf保护?
在您的端口中您提到了 "access+refresh tokens",这听起来像是您在使用 OAuth。在 cross-origin 场景中,CSRF 通常根本不是问题。如果您的客户端需要发送任何类型的 HTTP Header 来进行身份验证,您可以安全地禁用 CSRF。
CSRF 攻击会使您的浏览器发送为 [API] 域存储的 cookie,并且通过一些黑客攻击,攻击者还可能发送 "X-Requested-With: XMLHttpRequest"。但是如果你的 API 也需要一个 "Authorization: Bearer ..." 令牌,你可以放弃整个 CSRF 麻烦。
下面是我们应用程序的架构。
- Web 界面 [客户端] 是独立的 Angular 2 应用程序 [domain.com]
- 持有客户端凭证的[代理][网络界面秘密][domain2.com]
- [API]本身有认证服务器[domain3.com]
申请流程如下:
- 用户在[客户端]登录页面输入他的凭证用户名+密码,然后将其发送到[代理]。
- 然后代理会将凭据附加到请求并将其转发到 [API].
- [API] 将能够在验证用户凭据后获得访问+刷新令牌 & return 它到 [代理]
- [proxy] return 响应连同 header [Set-Cookie:XSRF-TOKEN ]
- [client] 应该能够读取 [XSRF-TOKEN] 并将其作为 [X-XSRF-TOKEN] header.
除第 5 步外,在身份验证服务器、代理和客户端上一切正常:
Angular 应该能够根据文档自动处理这个问题
{ provide: XSRFStrategy, useValue: new CookieXSRFStrategy('XSRF-TOKEN', 'X-CSRF-TOKEN')}
哪里 angular 将能够获取 [XSRF-TOKEN] cookie 的值并创建 [X-CSRF-TOKEN] header 以及我们通过应用程序提出的每个请求。
虽然 & 当我使用不同的来源构建架构时,angular 无法从另一个来源读取 cookie。
我面临的这种方法的问题是,由于服务器位于不同的域中,我无法通过 XSRFStrategy 提供程序读取 cookie。有没有办法读取该 cookie 的值?
如果不是,那么当前架构是错误的&我需要在同一个架构中构建[client] & [proxy]我避免使用这种方法的域,因为我需要将表示层与任何后端代码分开。
所以,我的问题是如何针对这种情况实施csrf保护?
在您的端口中您提到了 "access+refresh tokens",这听起来像是您在使用 OAuth。在 cross-origin 场景中,CSRF 通常根本不是问题。如果您的客户端需要发送任何类型的 HTTP Header 来进行身份验证,您可以安全地禁用 CSRF。
CSRF 攻击会使您的浏览器发送为 [API] 域存储的 cookie,并且通过一些黑客攻击,攻击者还可能发送 "X-Requested-With: XMLHttpRequest"。但是如果你的 API 也需要一个 "Authorization: Bearer ..." 令牌,你可以放弃整个 CSRF 麻烦。