jQuery反序列化由PHP序列化的数据

时间:2017-04-26 18:59:44

标签: php jquery

如何在jQuery中反序列化数据?记得数据是由PHP序列化的。下面给出了示例。

a:2:{i:0;s:9:" img1.jpeg";i:1;s:9:"img2.jpeg";}

1 个答案:

答案 0 :(得分:1)

可以使用unserializejson_encode

来实现
$unserialized = unserialize($serialized_from_db);
echo json_encode($unserialized);

但请注意您提供的样本:s:9:" img1.jpeg"此部分不正确。 s:9表示它期望字符串为9个字节(这个link提供了理解serialize输出的良好指南,但是" img1.jpeg有一个空格,因此是10个字节并失败:demo failing。您可以添加一个检查以查看是否易于反序列化:

if ($unserialized === false)

将错误的部分修复为:s:9:"img1.jpeg时,为您提供:

a:2:{i:0;s:9:"img1.jpeg";i:1;s:9:"img2.jpeg";}

现在可以使用,请参阅demo

在一天结束时,我建议像其他人一样,在您的数据库中存储json_encode d值,而不是serialize d值。

我提出了一个非常糟糕的黑客攻击来修复错误的序列化数据:

<?php
function hackFixUnserialized($unserialized_string) {
  $parts = explode(';', $unserialized_string);
  foreach ($parts as &$part) {
    $kv = explode(':', $part);

    if ($kv[0] == 's') {
      $str_without_quotes = str_replace('"', '', $kv[2]);
      if ($kv[1] != strlen($str_without_quotes)) {
        $kv[1] = strlen($str_without_quotes);
      }
    }

    $part = implode(':', $kv);
  }

  return implode(';', $parts);
}

$unserialized_from_db = <<<EOT
a:2:{i:0;s:9:" img1.jpeg";i:1;s:9:"img2.jpeg";}
EOT;

$unserialized = unserialize($unserialized_from_db);
if ($unserialized === false) {
  $hack_fix = hackFixUnserialized($unserialized_from_db);
  printf('bad unserialized, fixed to: %s%s', $hack_fix, PHP_EOL);
  $unserialized = unserialize($hack_fix);

}

echo json_encode($unserialized);

在此演示:https://eval.in/783408

希望这有帮助