问题标签 [x-xsrf-token]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
safari - Safari 11 X-XSRF-TOKEN 刷新后未更新
最近 Safari 11 在 Mac OSX 上发布。此更新导致我们的 web 应用程序与我们 reuest 标头上的 XSRF 相结合出现问题。我将尝试以逻辑的方式描述问题。好的情况是这样的:
当用户想要登录时,他会收到来自服务器的响应,其中包含一个包含 XSRF 令牌值的 Set-Cookie。
Eg: Set-Cookie: XSRF-TOKEN=LKNBX4DZhL708KjXNkgXnlxTDCNuhsZG1kTc2SFy498; Path=/; Secure
页面刷新 将执行的下一个调用在标头中包含正确的 XSRF 值。在服务器端检查值等。来自前端的每个调用都将包含该 XSRF 令牌。
如果用户注销并想再次登录,他的 XSRF cookie 将被一个新值覆盖,并且能够使用该令牌登录。
我们有问题的情况(在 Mac OSX 上使用 Safari 11,其他浏览器不显示此行为):
如果不存在cookies,用户可以正常登录
但是,如果他想重新登录(在前一个会话之后),就会发生刷新。在第一次调用时,在他的调用中刷新 XSRF 令牌不会被新值替换,它们仍然包含上一个会话中的旧 XSRF 令牌。当我们检查这个请求时,我们看到这个请求上的 cookie 包含正确的值,但标头反映的是旧令牌。
这个带有错误标头的调用会导致后端的会话关闭,因此用户被踢出会话。TLDR;在 Safari 11 中,标头 XSRF-TOKEN 在刷新后不会相应地更新为 cookie 值。我们在旧版本和其他浏览器上进行了这项工作,我们认为这是 Safar 11 的错误。
有没有其他人遇到过类似的问题?在 Safari 11 中刷新页面后,请求的标头值在哪里不更新?
编辑:经过测试,我们发现在 URL 中放置时间戳作为查询参数会强制 Safari 11 发送正确的请求。似乎一些请求被缓存并且更新的标头被忽略了..
非常感谢!
angular - 如何在angular4中发送带有响应头的“X-CSRF-TOKEN”
我目前正在开发一个 Angular4 应用程序。现在我想实现 XSRF 保护。在响应头 cookie 中,我得到“XSRF-TOKEN”,我需要在下一个请求头 cookie 中发送“X-XSRF-TOKEN”。正如Angular 官方文档中提到的,Angular 正在处理这个问题。但就我而言,角度并没有处理它。所以我创建了以下自定义 XsrfInterceptor 来附加“X-XSRF-TOKEN”和响应头。
在我的主模块中,我将它包含在提供程序中,
但不幸的是,它不起作用。我认为我的应用程序没有调用自定义拦截器的拦截方法(它没有打印 console.log('xsrf 拦截器调用'))。
我的http标头如下:
在响应标头中:
下一个请求标头:
我正在使用以下版本的角度库:
spring-security - Angular 5 无法从 HttpXsrfTokenExtractor 获取 XSRF 令牌
我正在尝试通过绝对 URL向 Spring(基本身份验证)安全的 Rest API 发出 POST 请求。
在阅读了 Angular 省略了将X-XSRF-TOKEN自动插入到绝对 URL 的请求标头中之后,我尝试实现一个HttpInterceptor来添加令牌。
在我的原始/signin POST 请求中,我创建了必要的授权:基本标头以确保 Spring 对请求进行身份验证。
返回的响应标头包含预期的set-cookie令牌:
Set-Cookie:XSRF-TOKEN=4e4a087b-4184-43de-81b0-e37ef953d755; Path=/
但是,在我的自定义拦截器类中,当我尝试从注入的HttpXsrfTokenExtractor获取下一个请求的令牌时,它返回null。
这是我的拦截器类的代码:
tokenExtractor.getToken()在上面的代码中返回 null。我希望它能够从我之前的/signin请求
的 Spring (Set-Cookie) 响应标头中返回令牌。
我阅读了有关创建拦截器的相关帖子:
angular4 httpclient csrf does not send x-xsrf-token
但除此之外,我无法找到 HttpXsrfTokenExtractor 的很多文档:
https
://angular.io/api/common/http/HttpXsrfTokenExtractor
问题:为什么HttpXsrfTokenExtractor.getToken()返回 null?
此外,我将拦截器类添加为app.module的提供者。
这是我的 app.module.ts:
另一件需要注意的事情是,我从localhost:3000在 Node.js 上运行我的 Angular 前端,从localhost:8080运行我的 Spring Rest 后端。它们位于不同的端口上,因此使用绝对 urls发出 http 请求的原因。当来自对不同域的请求的响应时,
浏览器会阻止Set-Cookie工作吗?
我还能错过什么吗?
感谢您的任何帮助。
----------------------------------------------
[更新于 1 月 7 日2018]
修复
我使用Webpack 开发服务器来提供 Angular 代码。我通过为指向我的后端 Rest API 的 url配置代理解决了这个问题。
这意味着从浏览器发出的所有请求现在只能发送到端口3000的开发服务器,即使是对于 Rest API 调用也是如此。
当webpack 开发服务器看到任何带有配置模式的请求 url(例如 /api/...)时,它会替换为对http://localhost:8080上的后端服务器的调用(在我的例子中)。
这是我添加到 webpack.dev.js 的devServer部分的内容文件:
有了这个设置,我不再从 Angular 代码发出跨域(跨域)请求,也不再使用绝对 URL。这极大地简化了事情,因为我不再与 Angular XSRF (CSRF) 机制作斗争。它只是默认工作。我也不需要使用HttpInterceptor手动插入X-XSRF-TOKEN。
设置开发服务器代理的额外好处是客户端请求不再是绝对的,因此我不需要更改所有用于生产的 Rest API 调用。
我希望这对遇到同样问题/理解的人有用。
Webpack 开发服务器代理文档参考:
https ://webpack.js.org/configuration/dev-server/#devserver-proxy
c# - 分布式 SPA 应用程序中的防伪令牌
我正在开发一个分布式高可用性单页应用程序,该应用程序由 docker 节点集群提供服务。有时一个节点会死掉(出于完全正当的原因,所以这不是问题)。然后,所有客户端都会无缝地重新路由到其他节点之一。不幸的是,它们的所有 XSRF 令牌都无效,因为它们存储在客户端的内存中。
因此,问题是,我们如何在基于 *nix 的设置中分配当前 XSRF 令牌的存储?
c# - Antiforgery.Validate() 似乎不起作用?CSRF 问题
我已将下面的代码放在我的表单中。然后,该请求将在其 cookie 中显示一个令牌,并且在生成我的 html 时还会创建一个隐藏字段。请注意,cookie 和隐藏字段都有不同的值。
每次我回发时,我都有下面显示的验证器。
奇怪的是,即使我强行更改隐藏字段中的 cookie(使用 burp 之类的 MITM 软件)。验证器甚至不会检测到令牌已被更改。
我已经列出了生成的令牌(刷新页面几次)并尝试使用列出的令牌之一来操作最新的请求。毫不奇怪,验证器没有发现错误。
我读到令牌是基于会话的,所以我尝试在另一个会话(另一个用户)上使用令牌。而且,验证器仍然没有捕获任何东西。
更改 cookie 中的令牌会捕获错误,但该 cookie 令牌是恒定的,并且对于所有表单都是相同的。
这个问题有什么问题或任何其他缺失的部分吗?
angularjs - 如何使用angularJS实现spring security默认CSRF保护
我有一个 spring boot 应用程序,我用 spring security 保护了它。现在我想保护它免受 CSRF 漏洞的影响,所以我将这一行添加到我的 spring 安全配置中:
对于客户端,我使用的是 angularJS 1.6。我将这两行添加到我的 app.js 文件中:
现在,当我尝试执行某些请求时,我得到了未经授权的状态,
我认为我遗漏了一些东西,有人可以帮助我吗?
---- 更多细节:这是我的 spring 安全配置:
c# - ASP.NET Core WebAPI:验证提供的防伪令牌失败。交换了 cookie 令牌和请求令牌
在我的 ASP.NET Core 2 WebAPI 应用程序中,我想将 AntiforgeryToken 用于我的 POST、PUT 和 DELETE 控制器方法。Reagrding to this documentation我设置了我的班级的ConfigureServices
和Configure
方法。Startup
在客户端,我使用 Angular 5 及其 Antiforgery 的默认配置。我无法弄清楚问题出在哪里。
这是我的 Startup.cs 的摘录
我的控制器都是这样的:
angularjs - 来自 ASP.Net 的带有 XSRF-TOKEN 的 AngularJS 返回 400
我有一个非常奇怪的问题,试图在 ASP.Net Core 中的角度 $http post 调用上实现 XSRF。
POST Register 工作正常并具有以下签名:
但是 POST Logout 返回具有相同签名的 400:
配置服务:
配置:
角度调用如下所示:
API 位于同一解决方案中的单独项目中。帮助 :)
angular - .NET CORE API with Angular 4 - 交换了 cookie 令牌和请求令牌
尝试使用 Angular 和 .NET CORE 实现 XSRF 时,我不断收到此消息:“验证提供的防伪令牌失败。cookie 令牌和请求令牌已交换。” 我在 Angular 和 API 中配置了相同的 cookie 和标头名称。有人有想法么?
过程
Angular 对该 API 方法进行初始调用以检索 cookie
然后 Angular 拦截下一个 POST 请求并稍微覆盖默认的 XSRF 处理,因为我需要它来处理 HTTPS URL
cookies - 无法在 Angular JS 1.5.5 中读取 XSRF-TOKEN cookie
为了保护应用免受 CSRF 攻击,我们从服务器端设置了一个名为XSRF-TOKEN的 cookie。因此,我们可以从客户端代码设置cookie并发送到服务器,但是要在服务器端验证CSRF,我们需要在触发“POST”服务调用时发送标头。根据角度文档,$http 通过读取 cookie 自动设置标题X-XSRF-TOKEN(请参阅链接),但是尽管我们已将应用程序部署在同一域上,但 Javascript 代码无法读取 cookie。服务器端 cookie 生成代码和服务部署细节如下,
UI 部署在 8080 端口,服务部署在同一 VM 内的 8084 端口