为什么要允许客户端关闭 XSRF 保护?
Why would one allow clients to switch off XSRF protection?
前段时间,我在工作中使用的一个软件中发现了一个选项,通过在客户端包含一个特殊的 HTTP header 值来关闭 XSRF server-side 保护。因此,我想:
- 这怎么不是安全漏洞?
- 为什么要实施安全功能并允许客户将其关闭?有没有use-case我不见了?
我怀疑我目前对 XSRF 保护的了解,由于我们无法在工作中达成共识,我决定 post 在这里表达我的担忧。
该产品是 Bamboo,他们在 https://confluence.atlassian.com/bamkb/rest-api-calls-fail-due-to-missing-xsrf-token-899447048.html#RESTAPIcallsfailduetoMissingXSRFToken-Workaround. I first mentioned this in an old answer here: 中公开报告了该选项。
我想反过来问:为什么要实现安全功能然后要求用户打开它们?这是随处可见的安全选择加入模型,例如从字面上看,没有人强制执行 2FA,尽管这是一项巨大的安全改进。
如果 XSRF 是基于会话的,并且您 运行 使用同一应用程序的多个选项卡,并且您被迫在其中一个选项卡中重新进行身份验证,您通常会获得一个新的 XSRF 令牌。其他选项卡可能不再通过 XSRF 检查,并有丢失未保存工作的风险。可能还有其他类似的情况。
有时需要在安全性和可用性之间进行权衡,在这种情况下,他们默认安全性,让 运行 遇到问题的人承担知情风险。
还有其他方法可以缓解 XSRF。因此,如果 cookie 不是一个选项(可能客户端不支持 cookie),您可能希望禁用此 cookie 解决方案。
其他一些缓解 XSRF 的方法:
状态变量(Auth0 使用它)- 客户端将生成并随每个请求传递一个加密的强随机随机数,服务器将回显该随机数及其响应,允许客户端验证该随机数。 Auth0 doc
中有解释
始终检查引荐来源 header 并仅在引荐来源是受信任的域时才接受请求。如果 referer header 不存在或 non-whitelisted 域,则简单地拒绝该请求。使用 SSL/TLS 时通常会出现引荐来源网址。着陆页(主要是信息性的,不包含登录表单或任何安全内容可能有点宽松,并允许缺少引荐来源网址的请求 header
我可以理解允许服务器在每个 API 的基础上将其关闭。然而,允许客户将其关闭是一个非常糟糕的主意……这和不在那里一样好。我认为这是可以的唯一原因是为了向后兼容。可能有老版本的客户端依赖这种方式来缓解CSRF,而新的客户端使用新版本,并关闭旧版本(但必须使用其中一个)。
前段时间,我在工作中使用的一个软件中发现了一个选项,通过在客户端包含一个特殊的 HTTP header 值来关闭 XSRF server-side 保护。因此,我想:
- 这怎么不是安全漏洞?
- 为什么要实施安全功能并允许客户将其关闭?有没有use-case我不见了?
我怀疑我目前对 XSRF 保护的了解,由于我们无法在工作中达成共识,我决定 post 在这里表达我的担忧。
该产品是 Bamboo,他们在 https://confluence.atlassian.com/bamkb/rest-api-calls-fail-due-to-missing-xsrf-token-899447048.html#RESTAPIcallsfailduetoMissingXSRFToken-Workaround. I first mentioned this in an old answer here: 中公开报告了该选项。
我想反过来问:为什么要实现安全功能然后要求用户打开它们?这是随处可见的安全选择加入模型,例如从字面上看,没有人强制执行 2FA,尽管这是一项巨大的安全改进。
如果 XSRF 是基于会话的,并且您 运行 使用同一应用程序的多个选项卡,并且您被迫在其中一个选项卡中重新进行身份验证,您通常会获得一个新的 XSRF 令牌。其他选项卡可能不再通过 XSRF 检查,并有丢失未保存工作的风险。可能还有其他类似的情况。
有时需要在安全性和可用性之间进行权衡,在这种情况下,他们默认安全性,让 运行 遇到问题的人承担知情风险。
还有其他方法可以缓解 XSRF。因此,如果 cookie 不是一个选项(可能客户端不支持 cookie),您可能希望禁用此 cookie 解决方案。
其他一些缓解 XSRF 的方法:
状态变量(Auth0 使用它)- 客户端将生成并随每个请求传递一个加密的强随机随机数,服务器将回显该随机数及其响应,允许客户端验证该随机数。 Auth0 doc
中有解释
始终检查引荐来源 header 并仅在引荐来源是受信任的域时才接受请求。如果 referer header 不存在或 non-whitelisted 域,则简单地拒绝该请求。使用 SSL/TLS 时通常会出现引荐来源网址。着陆页(主要是信息性的,不包含登录表单或任何安全内容可能有点宽松,并允许缺少引荐来源网址的请求 header
我可以理解允许服务器在每个 API 的基础上将其关闭。然而,允许客户将其关闭是一个非常糟糕的主意……这和不在那里一样好。我认为这是可以的唯一原因是为了向后兼容。可能有老版本的客户端依赖这种方式来缓解CSRF,而新的客户端使用新版本,并关闭旧版本(但必须使用其中一个)。