【问题标题】:PHP unserialize error at offset, works on some servers, not othersPHP 在偏移量处反序列化错误,适用于某些服务器,而不适用于其他服务器
【发布时间】:2011-05-08 03:14:21
【问题描述】:

我的代码可以在少数服务器上运行,但在其他提供序列化数据的服务器上却不行。我这样称呼一个页面:

http://domain/index.php/sales/Drilldowns?params=a:12:{s:13:"selectionType";s:8:"facility";s:8:"dateType";s:5:"daily";s:10:"dateOption";s:9:"drilldown";s:6:"metric";s:13:"bookingAmount";s:9:"companyFK";s:2:"11";s:10:"facilityFK";s:0:"";s:7:"classFK";s:0:"";s:15:"customDateStart";s:4:"null";s:7:"newDate";s:10:"2010-11-01";s:10:"metricName";s:10:"Bookings%20$";s:16:"currentDateRange";s:10:"11/01/2010";s:23:"currentMetricNavigation";s:8:"DELDELTE";}&getExcel=0

这是我正在使用的代码:

protected function getRequestVariables(){
        if(isset($_REQUEST['params'])){
            var_dump($_REQUEST['params']);
            echo 'length:'.strlen($_REQUEST['params']);
            $vars = unserialize($_REQUEST['params']);
            var_dump($vars);
        } else {
            $vars = $_REQUEST;
            // unset saved drilldown options
            $this->ci->session->svar_set('postVars', null);
        }

这是var_dump 输出:

string(447) "a:12:{s:13:\"selectionType\";s:8:\"facility\";s:8:\"dateType\";s:5:\"daily\";s:10:\"dateOption\";s:9:\"drilldown\";s:6:\"metric\";s:13:\"bookingAmount\";s:9:\"companyFK\";s:2:\"11\";s:10:\"facilityFK\";s:0:\"\";s:7:\"classFK\";s:0:\"\";s:15:\"customDateStart\";s:4:\"null\";s:7:\"newDate\";s:10:\"2010-11-01\";s:10:\"metricName\";s:10:\"Bookings $\";s:16:\"currentDateRange\";s:10:\"11/01/2010\";s:23:\"currentMetricNavigation\";s:8:\"DELDELTE\";}"

当它被处理时,我收到以下错误:

遇到 PHP 错误
严重性:通知 消息:unserialize() [function.unserialize]:447 字节偏移量 6 处出错
文件名:plugins/Drilldowns.php
行号:93

我在 5.2.13 上尝试这个 - 适用于某些 Linux、某些 OS X,而不适用于其他。已经检查了 php.ini、charset(我认为)——我一辈子都想不通。我尝试过像

这样简单的事情
string(18) "a:1:{s:3:\"sam\";}" length:18

它仍然错误。有什么线索吗?

【问题讨论】:

  • 你能显示你正在使用的确切的反序列化代码吗?
  • 我们需要代码。如果它只在某些服务器上工作,它可能是特定于平台或版本的。
  • 它适用于 5.2 linux (Centos) 但不适用于 5.3 - 在某些 Mac 上失败,但在其他 Mac 上失败

标签: php serialization


【解决方案1】:

是引号前面的反斜杠:\"

当您删除它们时,它会起作用。

var_dump(unserialize('a:12:{s:13:"selectionType";s:8:"facility";s:8:"dateType";s:5:"daily";s:10:"dateOption";s:9:"drilldown";s:6:"metric";s:13:"bookingAmount";s:9:"companyFK";s:2:"11";s:10:"facilityFK";s:0:"";s:7:"classFK";s:0:"";s:15:"customDateStart";s:4:"null";s:7:"newDate";s:10:"2010-11-01";s:10:"metricName";s:10:"Bookings $";s:16:"currentDateRange";s:10:"11/01/2010";s:23:"currentMetricNavigation";s:8:"DELDELTE";}"'));

这个工作的服务器,可能已经打开了magic quotes

【讨论】:

  • 魔术引号在所有服务器上都已关闭 - 转储将它们放在那里。我将在一分钟内发布更多代码
  • @Sam 我得到了与斜杠相同的错误,当我删除它们时它们消失了。另外,我很确定var_dump 不会添加这样的斜线。您可以在数据上尝试stripslashes() 吗?
  • 你是对的 - 我添加了 stripslashes() 并且它有效。我已经验证了 magic_quotes 已关闭 - 但我会检查我们的框架是否有某些东西没有注入这些。非常感谢!
  • @Pekka:如果我们这样做,我们的代码会变得脆弱吗?出于安全原因,我很少理解斜杠是添加的,对吗​​?你能启发我吗?
【解决方案2】:

我遇到了这个问题,我花了一段时间才解决它。我只是找不到任何好的解决方案,但这就是我为解决我的情况所做的:

 base64_encode(serialize($User)); // make sure to encode the serialized object
 unserialize(base64_decode($User)); // decode it before unserializing

【讨论】:

  • 我不知道我是否可以对这篇文章做出反应,但我有相同的问题,我正在使用 base64_encode(serialize($data)) ...我该如何解决?
  • 这是唯一真正有效的解决方案。正则表达式替换有时不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-24
相关资源
最近更新 更多