Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.4k views
in Technique[技术] by (71.8m points)

访问网站的ip到底能不能仿造?

RT。
若能仿造,请问如何仿造。
若不能仿造,请问原因(原理)是什么?

最近网站需要做一个安全验证,用ip地址来限制用户访问接口的次数,于是想到这个问题。
求解答。


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

可以伪造.

一般请求经过代理或者 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


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...