【问题标题】:REST and CSRF (Cross-Site Request Forgery)REST 和 CSRF(跨站请求伪造)
【发布时间】:2019-04-23 03:14:37
【问题描述】:

是否可以针对无状态 RESTful 服务进行跨站点请求伪造?

我不是在谈论服务器记住您通过 cookie 登录的伪 REST。我说的是没有 cookie 的纯服务器上无应用程序状态的 REST。

我正在使用 SSL 和基本身份验证。对于每个请求,授权标头都必须存在。尽管在 SSL 级别存在某种会话,但在 JSP 意义上没有“会话”。

假设我正在查看发出 Ajax 请求的合法网页,并且不知何故我转到同一选项卡或不同选项卡中的不同页面,并且该页面发出相同的 Ajax 请求。 (我假设合法网页上没有恶意代码;这完全是另一回事,在这种情况下一切皆有可能。)

当第二个页面发出 Ajax 请求时,浏览器是否会放置相同的 Authorization 标头?即浏览器会说“哦,你想再去那里吗?嘿,我碰巧还有钥匙!”?

另外,恶意脚本不能做 xhr 请求,然后在回调中从 ioargs 获取请求,获取 Authorization 标头并 un-Base64 名称和密码吗?

【问题讨论】:

    标签: security rest csrf


    【解决方案1】:

    免责声明:我不是安全专家。

    使用 HTTP Basic Auth 并不能防止通过 GET 请求进行的 CSRF 攻击。例如。其他人可以在他们的 HTML 页面中包含一个 img 标记,该标记对某个众所周知的 URI 执行 GET,并且您的浏览器将愉快地发送基本的身份验证信息。如果 GET 操作是“安全的”(这是任何声称是 RESTful 的第一条规则),这不会造成问题(除了浪费带宽)。

    Ajax 不是问题,因为同源策略。

    仅在您生成的 HTML 中包含服务器生成的令牌,并在表单提交请求中验证其存在,将保护您免受其他人在其页面中包含“外来”表单的影响。您可能会将其限制为浏览器生成的内容类型;对于 XHR 请求,无需这样做。

    【讨论】:

    • IFrame 以某种方式绕过同源。以下是否可能: hisData= some sort of iframe XHRGet(csrf);myURL='my.site/… src="'+myURL+"' />"; ? 假设 csrf 是获取一些敏感数据的 URL,并且是 GET在 my.site/grab 上记录我们在查询中输入的数据。
    • 浏览器不会检查这个吗?
    【解决方案2】:

    是否需要 CSRF 保护取决于两个因素:-

    1. 请求是否执行状态更改操作(与 REST API 无状态不同) - 状态更改操作是任何将更改应用程序状态的操作。例如删除一些东西,添加一些东西,更新一些东西。这些是应用程序用来更改用户支持状态的操作。所有 Post 请求和一些 Get 请求都属于此类别。 REST API 可以具有状态更改操作。

    2. 是否由浏览器提供身份验证(不限于 cookie) - CSRF 发生是因为身份验证信息包含在浏览器的请求中,无论请求是否由用户启动,或者其他一些打开的标签。因此,浏览器可以自行包含信息的任何类型的身份验证都需要 CSRF 保护。这包括基于 cookie 的会话和基本身份验证。

    对于属于以上 2 类的所有请求,都需要 CSRF 保护。

    正如上面 Stephan 所回答的,Ajax 请求受到同源策略 (SOP) 的保护。 SOP 防止另一个域读取目标域发送的内容。因此恶意脚本无法读取授权标头。但是 SOP 不会阻止另一个域向目标域发送请求。因此恶意脚本仍然可以向目标域发出状态更改请求。浏览器会在这个请求中包含认证信息和cookies,所以服务器需要知道这个请求是来自恶意域还是来自用户。因此需要 CSRF 保护。

    【讨论】:

      猜你喜欢
      • 2021-10-17
      • 2013-07-17
      • 2019-05-26
      • 1970-01-01
      • 2013-02-28
      • 2014-06-21
      • 2013-11-19
      • 1970-01-01
      • 2012-08-14
      相关资源
      最近更新 更多