我的 iPhone 应用程序通过 REST-ish API 访问服务器。我使用链接到客户端 IP 地址的 session 来帮助防止 session 劫持。但是我注意到来自某些客户端设备的服务器日志中有一些奇怪的请求序列。发生的情况是同一客户端从不同的 IP 地址请求我服务器上的不同 URL。典型的序列如下所示:
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
请求每个资源,所以我不认为这是我在代码中所做的任何事情。有没有人见过这样的事情?会不会是某种奇怪的代理?
最佳答案
我的印象是大多数网络都使用简单的 NAT。代理已经过时了,因为大多数数据都不能再缓存了(我们大学正在关闭它的代理;最后我检查他们关闭了缓存,因为大多数带宽都是用于 YouTube 之类的东西)。
另一方面,几年前,移动网络使用“转码”代理仍然相当普遍(参见“Cache-Control: no-transform”)。这只是为了增加带有垃圾浏览器的设备上的移动互联网使用率,否则这些浏览器无法呈现“流行”网站。不久前,我在各种运营商上测试了 HTTPS,发现其中一个 HTTP CONNECT 设置了某种 NAT(大概是为了减少代理开销),但是这样做的方式很糟糕,以至于连接没有建立。禁用代理使事情正常进行。
也许它是一个代理,它使用一个盒子进行 GETs 和另一个盒子用于 POSTs?或者它对请求/连接端点/等进行哈希处理以找出从哪个 IP 发送它?
如果您想了解发生了什么,请尝试联系相关用户,或调用 whois
查找所涉及的 IP。
一般来说,将 session 绑定(bind)到 IP 是不可取的。我知道有几个网站可以(Atlassian Crowd“SSO” token 应该绑定(bind)到 IP 地址);更好的让它成为一种选择(想到Livejournal)。最好的只是使用 HTTPS。
HTTPS 还可以阻止攻击者窃取用户的密码(并且用户将重复使用密码,因此即使您的网站不是安全关键,您也不应该传输未加密的密码。
我只是完全切换到 HTTPS;这并不难,而且 SSL 证书也不贵(StartCom 的免费“StartSSL”证书可能足以满足您的目的)。
如果 HTTPS 真的太多工作,假设您使用自定义 session 管理代码,那么在登录时返回随机 MAC key 并使用该 key (以及防止重播的序列号)签署 future 的请求并不难。仍然存在实时窃听和 MITM 攻击。
如果您使用 HTTPS 登录而不是其他请求,那么问题可能是 HTTP 被代理但 HTTPS 没有(因为代理根本不利于 HTTPS)。
关于iphone - 一个 iPhone 客户端,多个 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3506780/