我已经实现了一个简单的GWT应用程序,该应用程序具有登录服务(LoginService)和工作程序服务(WorkerService)。两者都是GWT-RPC。通过实现GWT的最新XsrfProtectedServiceServlet(请参阅GWT Xsrf-Safe Sample Projetct),我保护了所有服务免受XSRF的侵害。

实现此示例时,在页面加载时就在JSP文件中创建了 session ID。在这种情况下,即使用户未登录也是如此。

这是正确的方法吗?还是我必须在LoginService中创建 session ID(设置cookie)?但是,当以这种方式实现它时,LoginService本身不容易受到XSRF攻击吗?

谢谢,
帕斯卡

最佳答案

首先,简要回顾一下XSRF:

  • 用户浏览至some-attacker.com/evil.html
  • evil.html包含例如URL为“www.your-nice-site.com/doSomeAction”的<img>标记(或某些提交POST形式的JavaScript,...)
  • 这使用户的浏览器自动向您的站点提交GET或POST请求,并代表用户执行操作。不幸的是,用户的www.your-nice-site.com的cookie也会随请求一起自动发送,因此(也是问题所在)(如果用户已登录),则该请求将得到用户在您的完全授权下的完全授权服务器(也就是说,如果您的服务器不需要额外的反XSRF token )。

  • 现在很容易看出,不能使用XSRF攻击登录服务本身,因为到那时,用户尚未获得授权-攻击者必须知道用户的凭据才能执行登录。 (如果用户已经登录,则调用登录服务应该什么都不做![*])

    注意:当然,攻击者可能会采用其他技术来对用户的凭据进行攻击,最著名的是:网络钓鱼。反XSRF措施不能保护您免受此侵害。

    [*]如果您的服务无法使用反XSRF token 进行保护(例如登录服务),则尤其要确保它们不返回包含任何有值(value)信息的有效JSON/JavaScript!

    如果绝对需要,请务必将响应包装在JavaScript注释(/* */)中,如http://code.google.com/webtoolkit/articles/security_for_gwt_applications.html#json中所述。甚至更好:按照Why have "while(1);" in XmlHttpRequest response?中的说明,在响应之前添加while(1);。无论如何,这是一个好习惯。

    09-12 05:10