9

我试图了解如何使用 ASP.NET Web API 制作一个 API,该 API 将受到CSRF的保护,同时仍可从非 Web 环境(例如本机移动应用程序)访问。

我的第一个想法是非 Web 环境永远无法成功通过防伪令牌验证,因为它没有发布的表单。这是真的?有什么方法可以使验证工作吗?

如果没有办法验证,我的第二个想法是提供一个 API,它可以验证 Web 调用的防伪令牌,但不能验证非 Web 调用。然而,攻击者似乎可以很容易地使用这个“非网络”API 进行 CRSF 攻击,对吧?

答案是非 Web API 只需要支持非 Web 身份验证机制(OAuth?),因此无法通过浏览器重放对它的请求吗?或者有没有更简单的方法?

如果这是唯一的方法,是否有一种简单的方法可以关闭所有不安全的身份验证机制?ASP.NET Web API 中不应该有一些简单/快乐的路径来支持这些场景吗?

4

3 回答 3

6

仅当您使用持久性身份验证机制(例如 cookie、基本身份验证、NTLM 等)时,CSRF 才会成为问题。Mike Wasson 有一个在 Javascript 中针对 webapi 使用 CSRF 的示例 - 我在 DelegatingHandlers 中看到了版本......

由于 CSRF 只是 Web 场景中的一个问题,您可以争辩说没有真正需要检查非 Web 请求。来自浏览器的每个 ajax 请求,无论是通过 jquery、本机 XmlHttpRequest 类还是带有标头的任何东西 - X-Requested-With,它的值都是 XMLHttpRequest。因此,您可以将 CSRF 检查限制为仅具有该标头的请求,因为没有它的任何内容都必须来自浏览器外部。

话虽如此,如果您要进行身份验证,我会查看某种共享密钥或 OAuth 机制,并使用 DelegatingHandler 服务器端进行验证,然后在 Web 应用程序中将令牌放在可以通过 javascript 获取的某个位置,然后通过 X-Authentication 标头发送 - 因为它不是持久性的并且需要附加到每个请求(就像 CSRF 令牌一样),所以没有 CSRF 问题。Dominick 一如既往地很好地记录了这类事情。

于 2013-04-10T14:50:53.483 回答
0

查看最新 MVC4 更新中的 SPA 模板。他们有一个针对 Web API 的 Anti-CSRF 的示例实现。

于 2013-04-02T05:30:35.870 回答
0

看看 WebAPI 的 CORS 实现。

http://blogs.msdn.com/b/carlosfigueira/archive/2012/07/02/cors-support-in-asp-net-web-api-rc-version.aspx

然后,您可以只允许 localhost 作为 webapi 服务器上的有效 URI。这将防止其他站点在浏览器中加载攻击代码。

于 2013-04-08T18:45:42.940 回答