【问题标题】:CSRF on GAE Endpoints with oAuth带有 oAuth 的 GAE 端点上的 CSRF
【发布时间】:2016-01-25 23:43:45
【问题描述】:

我希望在我的 API 中实施针对 CSRF 攻击的保护,我使用 GAE 端点开发该 API,所有方法都需要 oAuth2。

在实施任何特定保护之前,我试图真正破坏我的应用程序(CSRF 乍一看很简单)。但就是做不到。

当我在另一个页面中引用我的端点时,浏览器会添加 cookie 信息,但不会添加带有不记名访问令牌的 Authorization 标头。这似乎还不够,因为我的端点会自动返回带有 www-authenticate:Bearer realm="https://accounts.google.com/" 标头的 401。

正如我所说,我没有针对 CSRF 的具体保护措施。但是,在 HTTPS 下使用具有 oAuth2 的 Google Cloud Endpoints 是否可以“免费”保护我免受此类攻击?

--编辑解决评论

我尝试了一个简单的 CSRF 攻击。我得到了一个带有<img src="https://bla-bla-bla-appspot.com/_ah/api/myapi/v1/resource.getMethod"> 的页面。然后我在另一个选项卡中打开我的应用程序时访问了此页面,因此我的浏览器将发送我的身份验证信息。它确实发送了 cookie,但不发送我的 oAuth 令牌)。

我什至没有尝试过 POST,如果我“破解”一个 GET 就已经很棒了。

【问题讨论】:

  • 不确定您是否看过this 以及在 cmets 中链接的文章,但它与 OAuth2 CSRF 的接缝(如果我理解正确的话)不是问题。我可能错了,如果您在其他地方找到任何答案,请分享(;
  • “当我在另一个页面中引用我的端点时,浏览器添加 cookie 信息而不是带有承载访问令牌的授权标头”具体是什么意思?能出示一下代码吗?

标签: google-app-engine google-oauth csrf google-cloud-endpoints


【解决方案1】:

OAUth 2.0 explicitly protects against CSRF 通过使用由客户端生成并由服务器验证的不可猜测的状态参数。即使攻击者能够欺骗客户端访问 URL 以授权恶意令牌,状态参数也不会与客户端的状态参数匹配,并且请求将被拒绝。

Google Cloud Endpoints 库会为您处理 OAuth 规范的这一点,因此您很清楚。

Oauth2 要求所有请求都将不记名访问令牌作为 HTTP 标头(使用 javascript 中的 XMLhttpRequest 设置标头并发出请求)或作为 URL 查询参数 (access_token)。攻击者不知道这个秘密值,因此无法创建一个可以通过验证的 URL。

【讨论】:

  • 您提供的链接是关于针对 OAuth 授权服务器的 CSRF 攻击,但是 OAuth2 令牌是否可以保护我的应用服务器免受此类攻击?
【解决方案2】:

这是(我希望)我的Kuoll remote debugger 对网络应用程序有帮助的 java sn-p。

package com.kuoll.server.filters;

import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CrossOriginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse resp = (HttpServletResponse) response;

        resp.addHeader("Access-Control-Allow-Origin", "*");
        resp.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS");
        resp.setHeader("Access-Control-Allow-Headers", "origin, content-type, accept");

        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void destroy() {
    }

}

resp.addHeader("Access-Control-Allow-Origin", "*"); 中的 * 替换为您的 Origin(如果需要)。

web.xml

<filter-mapping>
    <filter-name>CrossOriginFilter</filter-name>
    <url-pattern>/api/*</url-pattern>
</filter-mapping>

【讨论】:

  • 在过滤器中设置标题在 App Engine 中不起作用......但无论如何,你没有说任何关于 CSRF 的事情......正如我所说,我正在寻找如何打破我的应用程序之前盲目地实施任何修复(或证明我实际上已经受到保护)。不过谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 1970-01-01
  • 2011-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多