适用于RESTful API的CSRF

时间:2018-03-25 17:55:01

标签: angular .net-core csrf csrf-protection

据我了解CSRF,这是一个非常简单的方案:

  1. 用户(Bob)在其浏览器中为MyApp.com提供了身份验证Cookie。
  2. 攻击者向Bob发送电子邮件,其中包含指向MyApp-Crack.com网站的链接,其中包含魔术按钮“Click to win $ 10.000”,这是一个简单隐藏形式的button =“sumbit”,其中action =“myapp.com/user/delete -account.php“method =”POST“
  3. 点击此按钮,使用Bob的身份验证cookie向myapp.com/user/delete-account.php创建POST请求。
  4. 请求已通过身份验证,并执行了所需的操作。
  5. 想象一下,MyApp.com纯粹是带有RESTful后端的SPA,示例中的url(myapp.com/user/delete-account.php)是RESTful API(myapp.com/API/delete-account.json)并被称为只是来自浏览器javascript(角度)或移动应用程序(使用JWT)。

    想法:如果我在JavaScript中的任何请求中添加特定标头:

    headers.append('X-MyApp-Source', 'angular-app');

    并添加服务器端检查:

    if (user.AuthType == "cookies" && !request.Headers.Contains("X-MyApp-Source"))
    {
       return (400, "Bad request, missing source header");
    }
    

    攻击者是否可以通过Bob的Cookie和请求标头创建请求?

    • MyApp.com无法嵌入iframe X-Frame-Options
    • MyApp-Crack.com上的隐藏html表单不会添加此标题
    • 不同域上的javascript添加标题但不发送Cookie
      • 这不是真的。属性XMLHttpRequest.withCredentials:true将发送cookie

    我并不是说我的想法是防弹的,只是brianstorm。

    谢谢!

1 个答案:

答案 0 :(得分:0)

为什么MyApp-Crack.com不会使用withCredentials: true将相关的身份验证cookie发送到myapp.com?它无法读取cookie值,但仍可以发送它。

还可以使用旧的(或故意恶意的)broswer插件或扩展(旧版Java,Flash等)来添加标头。它与Referer / Origin检查大致相同,以防止CSRF - 比没有更好,但不是你能做的最好。

因此,在理想的情况下,它不会直接受到攻击,但也不会非常强大。