我试图了解如何使用ASP.NET Web API制作API,该API将受到CSRF保护,同时仍可从非Web环境(例如原生移动设备)访问应用)。
我的第一个想法是,非网络环境永远无法成功通过反伪造令牌验证,因为它没有张贴的表单。这是真的?有没有办法让验证工作?
如果没有办法验证,我的第二个想法是提供一个API,用于验证网络电话的防伪令牌,但不能用于非网络电话。然而,看起来攻击者似乎很容易就能够使用这个非网络" CRSF攻击的API,对吧?
非Web API需要的答案是仅支持非Web身份验证机制(OAuth?),以便无法通过浏览器重播对它的请求吗?或者有更简单的方法吗?
如果这是唯一的方法,是否有一种简单的方法来关闭所有不安全的身份验证机制?在ASP.NET Web API中是否应该有一些简单/快乐的路径来支持这些场景?
答案 0 :(得分:6)
当您使用持久性身份验证机制(例如cookie,基本身份验证,NTLM等)时,CSRF只会成为一个问题.Mike Wasson在Javascript中使用CSRF对抗webapi {我已经看到了DelegatingHandlers中的版本....
由于CSRF只是Web场景中的一个问题,因此您可以认为没有必要检查非Web请求。来自浏览器的每个ajax请求,无论是通过jquery,本机XmlHttpRequest类还是带有标头的任何内容 - X-Requested-With,其值都为XMLHttpRequest。因此,您可以将CSRF检查限制为仅具有该标头的请求,因为没有它的任何内容必须来自浏览器之外。
话虽如此,如果您要进行身份验证,我会查看某种共享密钥或OAuth机制,并让DelegatingHandler服务器端进行验证,并且在Web应用程序中只需将令牌放在某处即可通过javascript获取并通过X-Authentication标头发送 - 因为它不是持久的并且需要附加到每个请求(就像CSRF令牌),没有CSRF问题。多米尼克和以前一样,an example这种事情很好。
答案 1 :(得分:0)
查看最新MVC4更新中的SPA模板。他们有针对Web API的Anti-CSRF的示例实现。
答案 2 :(得分:0)
看一下WebAPI的CORS实现。
然后,您只能将localhost作为webapi服务器上的有效URI。这样可以防止其他网站在浏览器中加载攻击代码。