登录期间的会话处理,并在 GWT 中防止 XSRF(跨站点请求伪造)
Posted
技术标签:
【中文标题】登录期间的会话处理,并在 GWT 中防止 XSRF(跨站点请求伪造)【英文标题】:Session handling during login with protection against XSRF (cross-site-request-forgery) in GWT 【发布时间】:2011-09-14 00:10:15 【问题描述】:我已经实现了一个简单的 GWT 应用程序,其中包含一个登录服务 (LoginService) 和一个工作服务 (WorkerService)。两者都是 GWT-RPC。我通过实现 GWT 的最新 XsrfProtectedServiceServlet 保护了所有服务免受 XSRF 攻击(请参阅 GWT Xsrf-Safe Sample Projetct)。
实现这个例子,会话 id 是在 JSP 文件中创建的,就在页面加载时。在那种情况下,即使用户没有登录。
这是正确的方法吗?还是我必须在 LoginService 中创建会话 ID(设置 cookie)?但是这样实现时,LoginService 本身不会容易受到 XSRF 攻击吗?
谢谢, 帕斯卡
【问题讨论】:
【参考方案1】:首先,简要回顾一下 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 令牌)。
现在很容易看出,XSRF 不能用于攻击登录服务本身,因为此时用户尚未获得授权 - 攻击者必须知道用户的凭据才能执行登录。 (如果用户已经登录,那么调用登录服务应该什么都不做![*])
注意:当然,攻击者可能会使用其他技术对用户的凭据进行攻击,最明显的是:网络钓鱼。反 XSRF 措施无法保护您免受这种情况的影响。
[*] 如果您有无法使用反 XSRF 令牌保护的服务(例如登录服务),那么尤其要始终确保它们不返回 有效 JSON/JavaScript 包含任何有价值的信息!
如果您必须这样做,请始终将响应包装在 JavaScript cmets (/* */
) 中,如 http://code.google.com/webtoolkit/articles/security_for_gwt_applications.html#json 中所述。甚至更好:在回复前加上while(1);
,如Why have "while(1);" in XmlHttpRequest response? 中所述。无论如何,这是一个很好的做法。
【讨论】:
登录 XSRF 是无害的,这并不完全正确。假设应用程序容易受到自我 XSS 攻击:您可以注入脚本,但它们只会反映给您的用户。让我们使用以下设置: 创建一个加载应用程序的 iframe,显示一些敏感数据(使用攻击者的临时身份验证)。等一会儿。执行 XSRF 将目标登录到准备好的帐户并在网页源中运行脚本,以从其他框架中读取敏感数据。 @Niklas:这是真的,如果可以在不发送 XSRF 令牌的情况下显示敏感信息。有些人犯了以下错误:他们 XSRF 只保护那些可以更改服务器上某些内容的调用。这实际上大部分都可以,但是出于您提到的原因以及我在答案底部提到的原因,最好也保护检索敏感数据的调用。以上是关于登录期间的会话处理,并在 GWT 中防止 XSRF(跨站点请求伪造)的主要内容,如果未能解决你的问题,请参考以下文章
GWT:XSRF:零星缺少 X-GWT-Permutation 标头