GWT:XSRF:零星缺少 X-GWT-Permutation 标头

Posted

技术标签:

【中文标题】GWT:XSRF:零星缺少 X-GWT-Permutation 标头【英文标题】:GWT: XSRF: Sporadic missing X-GWT-Permutation header 【发布时间】:2011-03-25 08:09:14 【问题描述】:

RemoteServiceServlet.checkPermutationStrongName() 无法在HttpServletRequest 中找到 X-GWT-Permutation HTTP 标头时,我的应用程序偶尔会收到 GWT 引发的 XSRF 攻击错误。发生错误时,日志文件中会出现以下行:

WARNING: doUnexpectedFailure was invoked.
java.lang.SecurityException: Blocked request without GWT permutation header (XSRF attack?)

在托管模式和 Web 模式下的 Firefox 3.x 和 4.0 上都遇到过此问题。

我已运行 Live Headers,但确实缺少 HTTP 标头。

应用程序是普通的 GWT RPC。

有什么想法吗?

失败标头

http://127.0.0.1:8888/org.drools.guvnor.Guvnor/guvnorService

POST /org.drools.guvnor.Guvnor/guvnorService HTTP/1.1
Host: 127.0.0.1:8888
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.10 (maverick) Firefox/3.6.15
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Content-Length: 154
Content-Type: text/x-gwt-rpc; charset=utf-8
Referer: http://127.0.0.1:8888/org.drools.guvnor.Guvnor/Guvnor.html?gwt.codesv...
Cookie: standalone_usage=true
Pragma: no-cache
Cache-Control: no-cache


7|0|4|http://127.0.0.1:8888/org.drools.guvnor.Guvnor/|
6808FDC8A4FA3491026441B59E4DB72A|
org.drools.guvnor.client.rpc.RepositoryService|subscribe|1|2|3|4|0|

HTTP/1.1 400 Bad Request
Content-Type: text/plain;charset=ISO-8859-1
Transfer-Encoding: chunked
Date: Wed, 23 Mar 2011 20:11:04 GMT
Server: Apache-Coyote/1.1
Connection: close

成功标头

http://127.0.0.1:8888/org.drools.guvnor.Guvnor/guvnorService

POST /org.drools.guvnor.Guvnor/guvnorService HTTP/1.1
Host: 127.0.0.1:8888
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-GB; rv:1.9.2.15) Gecko/20110303 Ubuntu/10.10 (maverick) Firefox/3.6.15
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-gb,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
X-GWT-Permutation: HostedMode
X-GWT-Module-Base: http://127.0.0.1:8888/org.drools.guvnor.Guvnor/
Content-Type: text/x-gwt-rpc; charset=utf-8
Referer: http://127.0.0.1:8888/org.drools.guvnor.Guvnor/Guvnor.html?gwt.codesv...
Content-Length: 154
Cookie: standalone_usage=true
Pragma: no-cache
Cache-Control: no-cache


7|0|4|http://127.0.0.1:8888/org.drools.guvnor.Guvnor/|
41FA1D8B82DBBBC875605A4A29670D99|
org.drools.guvnor.client.rpc.RepositoryService|subscribe|1|2|3|4|0|

HTTP/1.1 200 OK
Content-Disposition: attachment
Content-Type: application/json;charset=utf-8
Content-Length: 48
Date: Wed, 23 Mar 2011 20:15:38 GMT
Server: Apache-Coyote/1.1 

【问题讨论】:

每个请求都会发生这种情况,还是只发生一些?是随机的,还是有规律的? 【参考方案1】:

我的申请也面临同样的问题。在 XmlHttpRequest 对象中设置时,看起来 FireFox 3.x 没有发送额外的请求标头!

对此的快速修复是在服务器端的 RPC 实现中覆盖方法 checkPermutationStrongName() 与空实现。

@Override
protected void checkPermutationStrongName() throws SecurityException 
    return;

我认为我们需要将此问题报告给 FireFox 以获得适当的修复。

【讨论】:

在 Firefox 帮助论坛上报告了这个问题。链接:support.mozilla.com/en-US/questions/802724?new=1 谢谢,我也在这里提交了错误:bugzilla.mozilla.org/show_bug.cgi?id=646378【参考方案2】:

根据我的经验,FF 偶尔会丢弃任何以“X-”开头的标题。

【讨论】:

【参考方案3】:

这个错误在 3 月 30 日首次出现在我们的日志中,所以我认为它可能与 FF 4.0 有关(FF4 于 22.03 发布)。几天前,我们还从 GWT 2.0.4 迁移到了 2.1.1。这也可以是一个提示。我们的应用程序在生产环境中经过 7 个月的严格测试。也许这些信息会对某人有所帮助。我正在寻找在浏览器缓存中检测过时的 gwt 应用程序的方法。当应用程序部署在服务器上时,我检查当前构建生成的排列名称并将其存储到列表中。检查每个 RPC 请求是否存在发送它的 gwt 排列。由于这个错误,我的机制被炸毁了。

【讨论】:

以上是关于GWT:XSRF:零星缺少 X-GWT-Permutation 标头的主要内容,如果未能解决你的问题,请参考以下文章

gwt rpc 调用的零星 502 错误

重新审视 GWT-RPC 和臭名昭著的零星“StatusCodeException:0”异常

登录期间的会话处理,并在 GWT 中防止 XSRF(跨站点请求伪造)

GWT 2.6 支持降价

Google 图层与 gwt-openlayers 出现错误

未在 GWT 模块的 .html 文件上调用 Servlet 过滤器