猿问

如何修复已被错误字节计数长度损坏的序列化字符串?

如何修复已被错误字节计数长度损坏的序列化字符串?

我使用的是Hotaru CMS和图像上传插件,如果我试图将图像附加到一个帖子中,我会得到这个错误,否则没有错误:

取消序列化()[功能.非序列化]:在偏移量处出错

违规代码(错误点指向*):

/**
     * Retrieve submission step data
     *
     * @param $key - empty when setting
     * @return bool
     */
    public function loadSubmitData($h, $key = '')
    {
        // delete everything in this table older than 30 minutes:
        $this->deleteTempData($h->db);

        if (!$key) { return false; }

        $cleanKey = preg_replace('/[^a-z0-9]+/','',$key);
        if (strcmp($key,$cleanKey) != 0) {
            return false;
        } else {
            $sql = "SELECT tempdata_value FROM " . TABLE_TEMPDATA . " WHERE tempdata_key = %s ORDER BY tempdata_updatedts DESC LIMIT 1";
            $submitted_data = $h->db->get_var($h->db->prepare($sql, $key));
            **if ($submitted_data) { return unserialize($submitted_data); } else { return false; }** 
        }
    }

数据从表,注意结束位有图像信息,我不是一个PHP专家,所以我想知道你们这些家伙/女孩可能会怎么想?

temdata_value:

a:10:{s:16:"submit_editorial";b:0;s:15:"submit_orig_url";s:13:"www.bbc.co.uk";s:12:"submit_title";s:14:"No title found";s:14:"submit_
content";s:12:"dnfsdkfjdfdf";s:15:"submit_category";i:2;s:11:"submit_tags";s:3:"bbc";s:9:"submit_id";b:0;s:16:"submit_subscribe";i:0;s:15
:"submit_comments";s:4:"open";s:5:"image";s:19:"C:fakepath100.jpg";}

编辑:我想我找到了序列化的部分.

/**
     * Save submission step data
     *
     * @return bool
     */
    public function saveSubmitData($h)
    {
        // delete everything in this table older than 30 minutes:
        $this->deleteTempData($h->db);

        $sid = preg_replace('/[^a-z0-9]+/i', '', session_id());
        $key = md5(microtime() . $sid . rand());
        $sql = "INSERT INTO " . TABLE_TEMPDATA . " (tempdata_key, tempdata_value, tempdata_updateby) VALUES (%s,%s, %d)";
        $h->db->query($h->db->prepare($sql, $key, serialize($h->vars['submitted_data']), $h->currentUser->id));
        return $key;
    }


GCT1015
浏览 590回答 3
3回答

素胚勾勒不出你

我没有足够的声誉来发表评论,所以我希望使用上述“正确”答案的人能看到这一点:由于php5.5,preg_reve()中的/e修饰符已被完全废弃,上面的preg_Match将出错。php文档建议在其位置使用preg_match_callback。请找到以下解决方案,作为上述建议的preg_match的替代方案。$fixed_data = preg_replace_callback ( '!s:(\d+):"(.*?)";!', function($match) {           return ($match[1] == strlen($match[2])) ? $match[0] : 's:' . strlen($match[2]) . ':"' . $match[2] . '";';},$bad_data );

慕虎7371278

还有另一个原因unserialize()失败,因为您不正确地将序列化的数据放入数据库(请参阅官方解释这里。自serialize()返回二进制数据和php变量不关心编码方法,因此将其放入文本中,VARCHAR()将导致此错误。解决方案:将序列化的数据存储到表中的BLOB中。
随时随地看视频慕课网APP
我要回答