当前位置: 首页 > 知识库问答 >
问题:

spring cloud Netflix Zuul、CSRF和表单提交

司空修贤
2023-03-14

我对spring cloud和CSRF保护有些问题。我用spring cloud安全、OAuth2等来保护我的应用程序(网关和注册服务)。

我向每个人(permitAll)授予/signup,这是网关路由到实际signup服务的位置。我还授予注册服务器上的每个人访问权限。这与预期的一样工作。

让我头疼的是CSRF保护。网关和注册服务都自行创建CSRF令牌。来自网关的令牌将被发送到客户端,而来自sign up服务的令牌将丢失(在网关的某个地方)。

如果我向sign up service发布了一些内容,CSRF保护就会启动,并指出令牌为空,或者实际值与期望值不匹配,如果我尝试重用来自网关的值(在HTTP报头中可用)。

我使用它在sign up服务上禁用CSRF,但它似乎不是正确的解决方案,因为它只在有人从客户端发送令牌回来时才起作用,就像Angular Spa一样。当我试图从浏览器提交表单(在注册服务上呈现)时,由于缺少_csrf参数,这会失败。如果我在sign up service上激活CSRF并将_CSRF参数添加到表单中,网关的CSRF保护就会启动,并显示实际令牌与预期的令牌不匹配,这是完全正确的,因为实际令牌是来自sign up service的令牌,预期令牌是来自网关的令牌。

我可以在网关上禁用CSRF,但这将导致我必须在REST客户机或SPA使用的每个服务上配置CSRF内容。

我尝试了HttpSecurity.csrf()配置中的ignoreAntMatchers(),在该配置中我可以排除特定路径,但这对我也没有帮助。期望值是完全不同的东西。似乎为POST请求创建了一个新的会话。

那么有没有可能我可以在网关使用CSRF和同时使用表单提交和Zuul的注册服务呢?

共有1个答案

缪远
2023-03-14

您应该能够使其工作:我认为在Zuul中应该禁用CSRF,并且Zuul应该转发来自服务的原始CSRF令牌。

您是否尝试设置自定义“敏感标头”以避免丢失令牌?由于默认配置是删除任何“cookie”和“set-cookie”头,您需要更改它:

zuul:
  routes:
    users:
      path: /myusers/**
      # This is the default value if not set
      sensitiveHeaders: Cookie,Set-Cookie,Authorization
      url: https://downstream

变成

zuul:
  routes:
    users:
      path: /myusers/**
      sensitiveHeaders: Authorization
      url: https://downstream
 类似资料:
  • 我正试图用crsf令牌保护我的Zend表单。如果我在表单中添加token元素,它总是会向我返回notEmpty错误消息。我做错什么了吗?谢谢 控制器中的操作: 在我看来,我呈现表单并转储错误消息 每次验证表单后,我都会收到如下错误消息: 如果我给元素填充了正确的值,最后一个错误总是token-NotEmpty,因此我的表单永远无效。

  • 本文向大家介绍PHP实现登陆表单提交CSRF及验证码,包括了PHP实现登陆表单提交CSRF及验证码的使用技巧和注意事项,需要的朋友参考一下 1、表单提交,并将其提交到本页 (1) form 属性method为post方法,修改路由,使其接收post、get的请求 Route::any('/admin/login','Admin\LoginController@login'); (2)LoginCo

  • 获取Form变量 通过Action的如下方法可以获取变量: GetSlice GetString GetInt GetBool GetFloat GetFile GetForm 自动映射 通常我们通过http.Request.Form来获得从用户中请求到服务器端的数据,这些数据一般都是采用name,value的形式提交的。xweb默认支持自动将这些变量映射到Action的成员中,并且这种映射支持子

  • 问题内容: 我是stackoverflow和CodeIgniter的新手,目前正在尝试在Internet上找到的一些简单代码示例,以开始使用。我现在正在处理的是一种使用CI和Ajax(jQuery)的表单,并将表单的输入保存在数据库中,然后在表单的同一页上显示最新的表单。如果我感到困惑,那是这里的4.7应用示例。最初的源代码位于此处,但为了与最新版本的CI配合使用,我对其进行了修改,并在下面引用了

  • 问题内容: 看起来这应该是jQuery内置的东西,不需要多行代码,但是我找不到“简单”的解决方案。说,我有一个HTML表单: 当有人更改选择字段时,我想使用ajax提交表单以更新数据库。我认为可以通过以下方式来执行以下操作,而无需手动创建值/属性,只需将它们全部发送即可,例如: 我想念什么? 问题答案: 这就是最终的工作。

  • 提交表单时,会触发 submit 事件,它通常用于在将表单发送到服务器之前对表单进行校验,或者中止提交,并使用 JavaScript 来处理表单。 form.submit() 方法允许从 JavaScript 启动表单发送。我们可以使用此方法动态地创建表单,并将其发送到服务器。 让我们看看它们的更多细节。 事件:submit 提交表单主要有两种方式: 第一种 —— 点击 <input type="