我的iPhone应用程序通过REST-ish API访问服务器。我使用链接到客户端IP地址的会话,以帮助防止会话劫持。但我在某些客户端设备的服务器日志中发现了一些奇怪的请求序列。会发生什么情况是我的服务器上的不同URL是由来自不同IP地址的同一客户端请求的。典型的序列看起来像这样:
ipaddr1: POST /users/foo/login -- grants a session linked to ipaddr1
ipaddr2: GET /users/foo/resource -- 401 Not Authorized (IP address mismatch in session)
ipaddr1: POST /users/foo/login -- grants a session linked to ipaddr1
ipaddr2: GET /users/foo/resource -- 401 Not Authorized (IP address mismatch in session)
ipaddr1: POST /users/foo/login -- grants a session linked to ipaddr1
ipaddr2: GET /users/foo/resource -- 401 Not Authorized (IP address mismatch in session)
...
等等,这些请求相隔大约3秒钟。有时甚至可以同时播放最多4个IP地址!
在客户端,我只是使用普通NSURLConnection
来请求每个资源,所以我认为这不是我在代码中所做的任何事情。
以前有人见过这样的事吗?它可能是某种奇怪的代理吗?
答案 0 :(得分:2)
我的印象是大多数网络都使用简单的NAT;代理已经过时了,因为大多数数据都无法缓存(我们的大学正在关闭其代理;最后我检查了他们关闭了缓存,因为大多数带宽都是像YouTube这样的东西)。
另一方面,几年前移动网络使用“转码”代理仍然相当普遍(参见“Cache-Control:no-transform”)。这仅仅是为了增加使用垃圾浏览器的设备上的移动互联网使用,否则无法呈现“热门”网站。前段时间,我在各种运营商上测试了HTTPS,发现一个HTTP CONNECT设置了某种NAT(可能是为了减少代理开销),但却以一种破碎的方式进行,以至于没有建立连接。禁用代理使事情有效。
也许这是一个代理,它使用一个框用于GET而另一个框用于POST?或者它散列请求/连接端点/等以找出从哪个IP发送它?
如果您想知道发生了什么,请尝试与相关用户联系,或对所涉及的IP进行whois
查找。
通常,将会话与IP绑定是不可取的。我知道有几个网站(Atlassian Crowd“SSO”令牌应该绑定到IP地址);更好的选择使它成为一种选择(Livejournal浮现在脑海中)。最好的只使用HTTPS。
HTTPS还可以阻止攻击者窃取用户的密码(用户将重复使用密码,因此即使您的网站不是安全关键,也不应该传输未加密的密码。
我完全切换到HTTPS;这并不困难,SSL证书并不昂贵(StartCom的免费“StartSSL”证书可能足以满足您的需要)。
如果HTTPS实际上工作太多,假设您正在使用自定义会话管理代码,则在登录时返回随机MAC密钥并使用密钥签署未来请求(以及防止重放的序列号)并不困难。仍有实时窃听和MITM攻击。
如果您使用HTTPS进行登录而不是其他请求,则问题可能是HTTP已被代理但HTTPS不是(因为代理根本不会使HTTPS受益)。
答案 1 :(得分:1)
您不能指望请求来自同一IP地址。 iPhone可以通过多个WiFi网络,3G,EDGE和GPRS循环发送请求。如果会话劫持是个问题,请使用SSL。
话虽如此,你所看到的行为并不典型;如果WiFi网络出现故障,iPhone应该只能将WiFi关闭到3G上(对于3G与EDGE和EDGE对GPRS相同)