自 2015 年 9 月 9 日以来,我们观察到通过 javascript 发送到我们系统的数据存在一些奇怪的行为。
问题出现在查询字符串发送到我们的服务器时。GET 请求中包含的参数的一些值被打乱。由于参数完全变形,因此无法映射接收到的数据。
例如,参数“foo=bar”会得到“foo=abr”或“foo=rab”。这意味着数据仍然可用,但字符不再按正确顺序排列。这种情况只发生在长度超过 8 个字符的参数上。
我们根据查询字符串的 jenkins hash 计算校验和。由于字符串只有 6 个字符长,因此此校验和可以正确传输。计算校验和后,GET 请求会立即发送到我们的系统。因此问题不应该出在 javascript 上。
分析我们服务器的访问日志发现,参数在接收时已经被打乱。
到目前为止,我们只能在 Mozilla Firefox 用户代理与 Microsoft Windows 操作系统结合使用时观察到此问题。昨天的错误请求示例显示了以下用户代理:
- Mozilla/5.0(Windows NT 10.0;rv:40.0)Gecko/20100101 Firefox/40.0
- Mozilla/5.0(Windows NT 10.0;WOW64;rv:38.0)Gecko/20100101 Firefox/38.0
- Mozilla/5.0(Windows NT 10.0;WOW64;rv:40.0)Gecko/20100101 Firefox/40.0
- Mozilla/5.0(Windows NT 5.1;rv:39.0)Gecko/20100101 Firefox/39.0
- Mozilla/5.0(Windows NT 5.1;rv:40.0)Gecko/20100101 Firefox/40.0
- Mozilla/5.0(Windows NT 6.0;rv:40.0)Gecko/20100101 Firefox/40.0
- Mozilla/5.0(Windows NT 6.0;WOW64;rv:40.0)Gecko/20100101 Firefox/40.0
- Mozilla/5.0(Windows NT 6.1;rv:39.0)Gecko/20100101 Firefox/39.0
- Mozilla/5.0(Windows NT 6.1;rv:40.0)Gecko/20100101 Firefox/40.0
- Mozilla/5.0(Windows NT 6.1;WOW64;rv:26.0)Gecko/20100101 Firefox/26.0
- Mozilla/5.0(Windows NT 6.1;WOW64;rv:32.0)Gecko/20100101 Firefox/32.0
- Mozilla/5.0(Windows NT 6.1;WOW64;rv:33.0)Gecko/20100101 Firefox/33.0
- Mozilla/5.0(Windows NT 6.1;WOW64;rv:34.0)Gecko/20100101 Firefox/34.0
- Mozilla/5.0(Windows NT 6.1;WOW64;rv:38.0)Gecko/20100101 Firefox/38.0
- Mozilla/5.0(Windows NT 6.1;WOW64;rv:39.0)Gecko/20100101 Firefox/39.0
- Mozilla/5.0(Windows NT 6.1;WOW64;rv:40.0)Gecko/20100101 Firefox/40.0
- Mozilla/5.0(Windows NT 6.2;WOW64;rv:40.0)Gecko/20100101 Firefox/40.0
- Mozilla/5.0(Windows NT 6.3;WOW64;rv:38.0)Gecko/20100101 Firefox/38.0
- Mozilla/5.0(Windows NT 6.3;WOW64;rv:40.0)Gecko/20100101 Firefox/40.0
这些请求不太可能是任何形式的攻击,因为这些请求来自广泛的 IP 地址,并且占总请求的比例非常低(低于 0.1%)。客户端的行为似乎也很正常。
有一篇 reddit 帖子(https://redd.it/3lxg26)以及 stackoverflow 上的一篇文章(https://stackoverflow.com/questions/32572264/what-might-be-shufflling-my-query-string-parameters-constructed-in-javascript) 描述了一个类似的问题。
有谁对这个问题有什么建议吗?或者在他们的应用程序中遇到了类似的问题?