首页 文章

使用Play Framework作为Chrome扩展程序的API后端时,CSRF令牌丢失

提问于
浏览
1

我有一个项目,其中Play Framework应用程序用作Chrome扩展程序的API后端 . 由于我没有为Play Framework项目指定任何过滤器,因此它默认启用CSRF保护(通过CSRFFilter),这可能适合我的情况,也可能不适合我的情况 .

在Chrome扩展程序中,我首先进行jQuery AJAX调用以登录,以便Play Framework服务器设置用户令牌cookie(用于在所有后续API调用中识别用户):

$.ajax({
        method: 'POST',
        url: serverUrl + "api/google_sign_in",
        contentType: "application/json; charset=utf-8",
        data: JSON.stringify({ google_id_token: token }),
        success: function (response) {
            onSuccess();
        },
        error: function (req, status, error) {
            onError(error);
        }
    });

调用成功,用户令牌设置为cookie . 到现在为止还挺好 . 但是,只要我尝试使用类似的jQuery AJAX调用进行任何其他API调用,Play Framework就会抱怨缺少CSRF令牌,大概是因为现在有一个需要保护的cookie集:

[CSRF] Check failed because no token found in headers for /api/get_status

呼叫失败了 . 根据我对CSRF保护的非常有限的理解,服务器应该在某些时候在某些生成的HTML中包含CSRF令牌?但在这种情况下,只有返回JSON的纯API调用 . 我是否希望在从服务器返回的JSON中明确指定CSRF令牌,然后在Javascript端的以下AJAX调用中手动将其作为标头包含在内?

此外,我是否需要为此类API后端提供CSRF保护?或者我可以完全禁用它吗?

谢谢,Nir

1 回答

  • 1

    根据CSRF filter上的官方文档,默认情况下启用CSRF过滤器几乎任何非GET,HEAD或OPTIONS请求(例如POST或PUT),其中存在某种cookie /授权标头并且CORS过滤器是未配置为信任请求的来源 . 您有几个选项可以解决此问题:

    • Manually tag routes that do not apply to CSRF

    这个很简单 . 进入您的路线文件,并将 + nocsrf 放在您想要免除CSRF保护的每条路线上方的行中 . 如果您没有 Build SPA /公共API,这种方法效果最佳 .

    • Configure CORS

    Set up the CORS filter接受来自多个域的请求,它将自动绕过CSRF .

    • Just disable CSRF entirely

    对于这种用户不直接使用网站的请求,可以假设,如果他们有一个有效的令牌,他们是正确的认证,你可以像你建议的那样禁用CSRF,你可能会没事的 . 请注意,CSRF确实使您的应用程序更安全,但仅限于确保不能从其他网站伪造请求 . 因为看起来你的API几乎无处不在,所以这不适用于你的项目 . 但是,如果有的话,我会在后端服务的任何表单和控件上使用它 .

    EDIT: According to this blog,如果你不得不担心XSS,你仍然应该使用CSRF . 基于令牌的身份验证不受CSRF的影响,但如果您不小心,您仍然可能受到XSS的攻击(默认情况是没有人足够小心,并且可以使用一点额外的安全性) . 确保客户端在发出请求时可以获取CSRF令牌,并将其与主登录令牌分开存储 . 然后在服务器上使用两者验证请求 .

相关问题