猫窝私语 — Makumo's Blog

玛酷猫的温馨小窝,记录生活点点滴滴。

@玛酷猫10年前

11/14
00:30
WordPress 建站日志

解决wordpress留言评论者IP都是127.0.0.1

刚刚开始用2.1版本的时候就发现这个问题,所有评论这的IP都是127.0.0.1,当时也没在意,心想可能是那块没有设置好,反正评论的人也不多。前几天更新成2.6.3后,发现这个问题依旧存在,127.0.0.1似乎在评论审核的黑名单中,弄的所有的评论都变成垃圾评论,都要一个个审核,很是烦人。

上网查了下资料,遇到这个问题的人并不多,还在有人提起,也有热心人回复了大概原因以及大概解决方案:原因是空间商启用了某种缓存机制导致取IP产生错误,使得结果都是本机IP,也就是127.0.0.1。解决方案也很简单,更换获取IP语句就好。

查了下PHP获取IP的语句,主要是以下几种

$_SERVER["HTTP_X_FORWARDED_FOR"; 
$_SERVER["HTTP_CLIENT_IP"]; 
$_SERVER["REMOTE_ADDR"]; 
getenv("HTTP_X_FORWARDED_FOR"); 
getenv("HTTP_CLIENT_IP"); 
getenv("REMOTE_ADDR"); 

剩下的就很简单了,写一个测试页面,一个一个试,看那个能显示正确的IP地址,在修改/wp-includes/comment.php ,我的文件是在第718行

	
$commentdata['comment_author_IP'] = preg_replace( '/[^0-9a-fA-F:., ]/', '',$_SERVER['REMOTE_ADDR'] );

将$_SERVER[‘REMOTE_ADDR’]改成上面测试正确IP的语句,问题解决。

本人对PHP还是初学者阶段,如有叙述不当之处,还希望多多斧正。

解决wordpress留言评论者IP都是127.0.0.1

  1. 我的正有这个问题,不过看过之后还是不懂
    $commentdata[‘comment_author_IP’] = preg_replace( ‘/[^0-9a-fA-F:., ]/’, ”,$_SERVER[‘REMOTE_ADDR’] );
    要改成什么。

    回复
  2. @tomogen
    用我遇到的情况举个例子吧,写一个测试文件,比如test.php,内容如下:
    < ?php echo IP函数 ?>
    依次将那6个函数放进去,通过域名/test.php访问,查看显示结果
    我的情况是,1、2、6显示为空,3、5显示的是127.0.0.1,4显示的是正确的IP,所以我把
    $commentdata[‘comment_author_IP’] = preg_replace( ‘/[^0-9a-fA-F:., ]/’, ”,$_SERVER[‘REMOTE_ADDR’] );
    改成
    $commentdata[‘comment_author_IP’] = preg_replace( ‘/[^0-9a-fA-F:., ]/’, ”,getenv(“HTTP_X_FORWARDED_FOR”);
    就解决了

    解释说明由于存在着安全隐患,请不要使用。
    @tomogen 的回复提到了一种解决办法,有相关问题的可以去看下。

    回复
  3. @tomogen
    会不会是引号问题,为了安全起见,留言板会自动把英文的引号替换成中文的引号,直接复制代码会出现错误的,要相应的把引号换回英文的呀。
    另外可以在IE的工具——Internet选项——高级里面,把“显示友好的HTTP错误消息”前面的勾去掉,就能看到具体的错误位置了。

    回复
  4. 你这样改有个安全问题,”HTTP_X_FORWARDED_FOR”这个值是通过获取HTTP头的”X_FORWARDED_FOR”属性取得.所以这里就提供给恶意破坏者一个办法:可以伪造IP地址。这样可能会有SQL注入的危险。而且安全和准确的方法是尽量避免使用getenv函数。

    我也遇到了这样的问题,http://www.jerryhong.com/2008/11/15/wordpress-plugin-comment-ip-fixer/ 上面有一个很好的解决办法。优先通过HTTP_CLIENT_IP获取IP,

    回复
  5. @gowers
    感谢你提出的问题,我是PHP初学者,也没有注意到安全性问题。getenv函数我已经去掉了,试了下使用$_SERVER是可以取到的,估计之前写测试的时候有点小问题。你发的那个解决办法我也看了源码,源码是先判断HTTP_CLIENT_IP是否是空,为空的话就取HTTP_X_FORWARDED_FOR,HTTP_X_FORWARDED_FOR再为空的话就取REMOTE_ADDR。
    这一点比较困惑,因为不知道我使用的空间采用了什么设置,HTTP_CLIENT_IP取出来的数据值一直是空,按照你给的解决办法和直接取HTTP_X_FORWARDED_FOR是等价的,毕竟HTTP_CLIENT_IP都是空。这个安全问题暂时用正则过滤+勤备份应对了。有机会问下空间商,看看他们使用了什么设置使得默认程序取不出来IP地址

    回复
  6. Pingback HTTP_X_FORWARDED_FOR、IP、安全性 | 猫窝私语 — Makumo's Blog

  7. Pingback [信息安全]HTTP_X_FORWARDED_FOR、构造IP及注入 | clzzy的博客!Just干!去做!JustGan!去干!

  8. 您好,我除了$_SERVER[“REMOTE_ADDR”]; 和getenv(“REMOTE_ADDR”); 取出来127.0.0.1之外其他的都是空的,请问这是怎么回事?

    回复