在使用JWT进行身份验证的情况下用金字塔/檐口编写REST API,我必须实现一些CSRF保护。在彻底阅读了这个主题之后,我理解了这个问题,但我对实现它的最佳方法相当困惑,考虑到所有可能的攻击矢量,这有点棘手。
由于该API提供了对敏感数据的访问,并且将作为开放源码软件发布,因此它需要一个自包含的保护。它将用于具有不可信子域的环境中,我不能依赖用户遵循安全准则。
对于无状态服务,我可以使用“Double Submit Cookie”或“Encrypted Token Pattern”-方法。
为了防止“cookie折腾”,Double Submit方法中的令牌需要是可验证的。MiTM攻击是一个额外的威胁,我希望通过只强制HTTPS-Cookie来充分缓解这一威胁。
为了获得攻击者不容易猜测和复制的可验证令牌,我认为像这样的散列令牌应该有效:
pbkdf2_sha256.encrypt($userid + $expire + $mycsrfsecret, salt=$salt)
过期将被设置为7天,之后JWT和CSRF-token都将通过新的登录被续订(它们也将在中间重新登录时被续订)。
另一种方法是向客户机发送一个字符串,该字符串由用户ID、过期和nonce组成,并用服务器端机密加密。在请求时,该字符串会被发送,服务器可以对其进行解密,并验证用户ID和过期时间。
这似乎是更简单的方法,但我不确定如何实现它,我不打算滚动我自己的加密,也没有找到好的例子:
使用JWT进行身份验证,用金字塔/檐口编写REST API
虽然我不熟悉这些框架,但我建议您确保JWT令牌是在HTTP头内传递的(例如my-jwt-token:...
),而不是cookie。那么您就不必担心CSRF向量了。
跨站点请求伪造是一个问题,因为浏览器总是倾向于向特定域提交通常包含身份验证信息的cookie。浏览器不会自动提交自定义标头,因此您不必担心。
双提交cookie
您的方法过于复杂,您可以简单地使用GUID。将该GUID放入cookie中,并将其放入请求的任何其他部分。如果它们相等,则CSRF检查通过。您还可以将GUID放入JWT中,然后验证GUID也在Header/Body/Query参数中。
hmac
,就像在import hmac
中一样。我不会费心加密,而只是确保令牌中没有敏感信息。否则PyCrypto可能对您有好处。CSRF是指针对Web应用程序的跨站点伪造攻击。 CSRF攻击是系统的经过身份验证的用户执行的未授权活动。 因此,许多Web应用程序容易受到这些攻击。 Laravel以下列方式提供CSRF保护 - Laravel包含一个内置的CSRF插件,可为每个活动用户会话生成令牌。 这些令牌验证相关的经过身份验证的用户是否发送了操作或请求。 实现 (Implementation) 本节将详细讨论Laravel
我的问题是,对每个表单使用一个令牌,而不更新每个表单提交的令牌,安全吗?这能防止CSRF吗?
我不熟悉Spring框架 如何在Spring 4.3中实施CSRF? 我参考了以下链接中的文档 https://docs.spring.io/spring-security/site/docs/current/reference/html/csrf.html 在这里我显示我的示例代码 web.xml dispatcher servlet。xml PageController。Java语言 WebS
简介 Laravel 可以轻松地保护应用程序免受 跨站点请求伪造 (CSRF) 攻击,跨站点请求伪造是一种恶意攻击,它凭借已通过身份验证的用户身份来运行未经过授权的命令。 Laravel 会自动为每个活跃用户的会话生成一个 CSRF「令牌」。该令牌用于验证经过身份验证的用户是否是向应用程序发出请求的用户。 无论何时,当您在应用程序中定义HTML表单时,都应该在表单中包含一个隐藏的CSRF标记字段,
6.9 CSRF和XSRF保护 6.9.1 简介 Cross-Site Request Forgery (CSRF) 跨站请求伪造是一种攻击,发生在具有恶意的网站,email,blog,即时消息,或者程序导致用户的web浏览器在一个受信用的网站去执行了某个有害的行为来获取当前用户的认证信息,详细了解请点击这里脑补。 在ASP.NET Web API官网也有如何实现的简短描述。 ABP框架尽可能的简
下面是我MERN项目的文件结构。 客户端文件夹包含反应服务器。客户端在<code>localhost.Client上运行。comServer文件夹包含节点的代码。js服务器。服务器运行于 每当我从客户端向服务器发出请求时。如何缓解 csrf 攻击?确保向服务器发出的请求来自客户端,而不是来自任何其他源。