为了克服CSRF攻击,我有作为描述的值从饼干采摘CSRF令牌送价值在标题为每个请求在这里.由于这是在每次请求时完成的,我在主模块的run函数中设置$ http的默认头.
现在,如果为同一网站打开了新选项卡,则服务器将发出新的csrf令牌(在cookie中).由于run函数只运行一次,因此csrf的默认标头将为旧标签(对于旧标签),而新的csrf cookie将发送到服务器,导致csrf-mismatch.
如何在全球范围内克服这个问题?
我想以某种方式创建一个函数,它将在每次调用$ http时运行,这样我就会覆盖默认的头文件.
注意:我不想为每个$ http请求设置此标头值.
(不是我认为它是相关的,但我使用的是ui-router)
编辑
这不仅限于csrf-token,我想根据登录用户设置一些其他标头,这必须动态完成(例如,当一个用户登录,然后注销,然后另一个用户登录).
你需要使用http拦截器在每个请求上执行此操作.在这里阅读更多关于http拦截器的信息
下面是一个这样的例子
module.factory('xsrfTokenInterceptor', function ($q, $http) { return { 'response': function (response) { var cookies = response.headers("Set-Cookie"); var token = someCrazyParsing(cookies); $http.defaults.headers.common["X-CSRFToken"]=token; return response || $q.when(response); } }; }); module.config(function($httpProvider){ $httpProvider.interceptors.push('xsrfTokenInterceptor') })