Angular9 XSRF 防护
跨站请求伪造 (XSRF 或 CSRF)是一个攻击技术,它能让攻击者假冒一个已认证的用户在你的网站上执行未知的操作。HttpClient
支持一种通用的机制来防范 XSRF 攻击。当执行 HTTP 请求时,一个拦截器会从 cookie
中读取 XSRF 令牌(默认名字为 XSRF-TOKEN),并且把它设置为一个 HTTP 头 X-XSRF-TOKEN,由于只有运行在你自己的域名下的代码才能读取这个 cookie
,因此后端可以确认这个 HTTP 请求真的来自你的客户端应用,而不是攻击者。
默认情况下,拦截器会在所有的修改型请求中(比如 POST 等)把这个请求头发送给使用相对 URL 的请求。但不会在 GET/HEAD
请求中发送,也不会发送给使用绝对 URL
的请求。
要获得这种优点,你的服务器需要在页面加载或首个 GET
请求中把一个名叫 XSRF-TOKEN
的令牌写入可被 JavaScript 读到的会话 cookie
中。 而在后续的请求中,服务器可以验证这个 cookie
是否与 HTTP 头 X-XSRF-TOKEN 的值一致,以确保只有运行在你自己域名下的代码才能发起这个请求。这个令牌必须对每个用户都是唯一的,并且必须能被服务器验证,因此不能由客户端自己生成令牌。把这个令牌设置为你的站点认证信息并且加了盐(salt
)的摘要,以提升安全性。
为了防止多个 Angular 应用共享同一个域名或子域时出现冲突,要给每个应用分配一个唯一的 cookie
名称。
注:
HttpClient
支持的只是 XSRF 防护方案的客户端这一半。 你的后端服务必须配置为给页面设置cookie
,并且要验证请求头,以确保全都是合法的请求。如果不这么做,就会导致 Angular 的默认防护措施失效。
配置自定义 cookie/header 名称
如果你的后端服务中对 XSRF 令牌的 cookie
或 头使用了不一样的名字,就要使用 HttpClientXsrfModule.withConfig()
来覆盖掉默认值。
imports: [
HttpClientModule,
HttpClientXsrfModule.withOptions({
cookieName: 'My-Xsrf-Cookie',
headerName: 'My-Xsrf-Header',
}),
],
更多建议: