PHP请不要再用这个函数获取真实IP

我已经有很长一阵子没有写过技术文章了,但是今天既然遇到了还是写了吧。

有很多人遇到过PHP获取IP的问题,然后就查找相关函数。无奈有些函数,虽然想法是好的,但是存在非常严重的问题

这个函数流传之广至于我在实习单位就见过不少次;流毒之久已经见了好几年;而毒害之深已经不是只言片语能说明白。

废话不多说,请看:

这是最经典的版本(还有好多变体万变不离其宗,不挂了)。各位觉得这没有问题?或许获取这些可以做到获取代理后面的用户IP,但是各位也要知道X-Forwarded-For等等这个东西是在Header里的,这势必就有一个问题:可以被轻轻松松伪造。

这会有什么问题?

  1. 有人可以用来伪造自己的地址,常用投票刷票。开发者以为用了这个就能获取真实IP避免刷票,万万没想到居然成为了刷票漏洞
  2. 有PHPer用这个函数获取IP限制访问频率,大家也知道这样根本没有意义。个别场景这种方式可以把正常IP丢进黑名单,做到不打瘫服务器正常用户就无法访问
  3. 最可怕的:有人用这个函数获取IP然后直接放进日志。但是过滤SQL注入字符的脚本只检查POST和GET,结果被IP注入。同时有一部分waf凑巧也不查Header……导致被注入,攻击者拿到了数据库重要数据

所以各位PHPer注意,这个函数有缺陷。

正常情况下使用代理访问的用户少之又少,甚至可以忽略。而真正想用代理隐藏自己的,也会想办法让你获取不到。投票系统最好做到依靠别的平台确定参与者身份;限制访问频率最重要是到你服务器的最后的IP和代理也无关。

建议直接获取REMOTE_ADDR。如果真的要获取X-FORWARDED-FOR,也请过滤,并且考虑被伪造可能。

发表评论

*

Protected with IP Blacklist CloudIP Blacklist Cloud