Magento一个极其隐蔽的bug

虫虫 发布于 2009/11/15 15:04
阅读 2K+
收藏 7

问题是这样的,某些电脑无法通过SSL访问Magento建的网站,所有HTTPS请求都被302跳转到HTTP首页去了。经过多次测试,这个问题跟机器无关,跟网络有关。通过某些网络(比如公司内网,VPN等等)访问Magento的网站会出现这个问题。但不是所有Magento的网站都有这个问题,这和Magento网站所在服务器的网络也有关系。

所以这个问题极其难重现。幸运的是,我女朋友公司的VPN访问我的Magento网站能不断重现这个问题。连续奋战三个晚上,终于把这个问题搞出来了。

 

问题出在以下代码:


Mage_Core_Model_Session_Abstract_Varien

protected function _validate()
    {
        #error_log("Varien->_validate()-1\n",3,"/home/ritaisho/php.log");
        $sessionData = $this->_data[self::VALIDATOR_KEY];
        #error_log("Varien->_validate()-2\n",3,"/home/ritaisho/php.log");
        $validatorData = $this->getValidatorData();
        #error_log("Varien->_validate()-3\n",3,"/home/ritaisho/php.log");
        if ($this->useValidateRemoteAddr() && $sessionData[self::VALIDATOR_REMOTE_ADDR_KEY] != $validatorData[self::VALIDATOR_REMOTE_ADDR_KEY]) {
            error_log("Varien->_validate()-4\n",3,"/home/ritaisho/php.log");
            return false;
        }
        if ($this->useValidateHttpVia() && $sessionData[self::VALIDATOR_HTTP_VIA_KEY] != $validatorData[self::VALIDATOR_HTTP_VIA_KEY]) {
            #error_log("Varien->_validate()-5\n",3,"/home/ritaisho/php.log");
            return false;
        }
        if ($this->useValidateHttpXForwardedFor() && $sessionData[self::VALIDATOR_HTTP_X_FORVARDED_FOR_KEY] != $validatorData[self::VALIDATOR_HTTP_X_FORVARDED_FOR_KEY]) {
            #error_log("Varien->_validate()-6\n",3,"/home/ritaisho/php.log");
            return false;
        }
        if ($this->useValidateHttpUserAgent()
            && $sessionData[self::VALIDATOR_HTTP_USER_AGENT_KEY] != $validatorData[self::VALIDATOR_HTTP_USER_AGENT_KEY]
            && !in_array($validatorData[self::VALIDATOR_HTTP_USER_AGENT_KEY], $this->getValidateHttpUserAgentSkip())) {
            #error_log("Varien->_validate()-7\n",3,"/home/ritaisho/php.log");
            return false;
        }
        #error_log("Varien->_validate()-8\n",3,"/home/ritaisho/php.log");
        return true;
    }

这个代码是感觉是为了防止中间人攻击之类的检查。根据访问记录,我女朋友公司的VPN访问我的Magento网站时确实有一个IP变换的过程。也就是用HTTP访问和用HTTPS访问我的网站,后台记录下来的IP不一样。我觉得这个导致了这里的验证失败,于是页面被跳转到HTTP首页,session也被重置。

 

Debug的过程真是惊天地泣鬼神,跟我当年做OS Project的时候有的一拼。首先是这个问题只出现在我的production网站上,同样的客户端访问我的test网站就是没有问题。于是只能选在深夜没有人访问的时候搞。其次,php没有像Java那样的远程调试工具(或许我不知道),于是我用error_log把整个请求过程中涉及到的代码,一行隔一行的打印了一遍。然后对比分析正常请求的log和不正常请求的log,最后发现了出现差异地方的代码……

 

仰天长啸,哈哈哈

 

 

加载中
0
红薯
红薯

你该给Magento提交这个bug,然后给出解决办法。

0
虫虫
虫虫

我已经在Magento论坛上贴了,正在讨论中

0
winsion
winsion

你真是  太强劲了,  路过,, 忍不住说一声

0
l
lever

很实用.收藏了..谢谢

0
1001
1001

....顶

0
c
chen

....顶, 学习收藏,以备后用。

0
y
yangzaibin

看来我也 恨 幸运,我昨天也遇上了!所以找到你了!

0
ycnxz
ycnxz
嗯 我也不知道怎么找bug 这种大型的 调用来调用去 找不到地方
0
风吟雨啸
风吟雨啸
 多谢分享
0
magento800
magento800
这个只是是否 要记录 客户的真实IP而已。而且是代理IP,你女朋友是VPN,根本记录不到。根本不是真正意义上的VPN 
返回顶部
顶部