14

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

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

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

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

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

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

4

2 回答 2

4

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

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

由于同源策略,Ajax 不是问题。

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

于 2010-01-08T15:05:08.110 回答
2

是否需要 CSRF 保护基于 2 个因素:-

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

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

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

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

于 2019-04-22T19:08:19.070 回答