可以伪造.
一般请求经过代理或者 CDN 之后,代理服务器会把用户的 ip 放在 x-forwarded-for
这个http 头里,经过多级代理之后,这个字段里会有多个 IP. 这个头你可以用程序模拟自己发送,这样就导致了这个头实际上是不可信任的. 你也可以和 CDN 约定使用特殊的 http 头来返回用户IP.但由于这个头不可信,会导致 cdn 做出两种选择,一种是把这x-forwarded-for
里的第一个 IP 作用用户的正式 IP 带给你,另一种就是完全不信任这个x-forwarded-for
,直接把这个 tcp 连接的对端 IP 作为用户 IP 带给你,但实际上,他也不知道这个 tcp 连接的对端,到底是用户还是一个代理服务器.
如果使用 x-forwarded-for
你自己发送一个头就可以绕过了.如果是第二种,虽然无法伪造,但是可能因为对端是一个运营商代理导致你一下子拦截住了一堆人..
一般情况,开发接口不做限制,需要用户登录或者 oauth 认证的接口,直接对用户 id 或者 appid 做请求限制即可.限制 IP 问题太多,你只能取舍,要么信任 cdn取 cdn 带来的用户 IP,要么不信任 cdn,直接取 remote_addr
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…