1398104) return false; $serialized = base64_decode($encoded, true); if ($serialized === false || strlen($serialized) > 1048576) return false; $offset = 0; $nodes = 0; $valid = true; $value = shop_order_decode_value($serialized, $offset, $nodes, $valid, 0); return $valid && $offset === strlen($serialized) && is_array($value) ? $value : false; } function shop_order_decode_value($data, &$offset, &$nodes, &$valid, $depth) { if (!$valid || $depth > 32 || ++$nodes > 20000 || $offset >= strlen($data)) { $valid = false; return null; } $type = $data[$offset++]; if ($type === 'N' && substr($data, $offset++, 1) === ';') return null; if (substr($data, $offset++, 1) !== ':') { $valid = false; return null; } if ($type === 's' || $type === 'a') { $end = strpos($data, ':', $offset); if ($end === false) { $valid = false; return null; } $number = substr($data, $offset, $end - $offset); if (!preg_match('/\A(?:0|[1-9][0-9]{0,6})\z/D', $number)) { $valid = false; return null; } $count = (int)$number; $offset = $end + 1; if ($type === 's') { if (substr($data, $offset++, 1) !== '"' || $count > strlen($data) - $offset - 2) { $valid = false; return null; } $value = substr($data, $offset, $count); $offset += $count; if (substr($data, $offset, 2) !== '";') $valid = false; $offset += 2; return $value; } if ($count > 10000 || substr($data, $offset++, 1) !== '{') { $valid = false; return null; } $value = array(); for ($i = 0; $i < $count && $valid; $i++) { $key = shop_order_decode_value($data, $offset, $nodes, $valid, $depth + 1); if (!is_int($key) && !is_string($key)) { $valid = false; break; } $item = shop_order_decode_value($data, $offset, $nodes, $valid, $depth + 1); if ($valid) $value[$key] = $item; } if (substr($data, $offset++, 1) !== '}') $valid = false; return $value; } if ($type === 'b' || $type === 'i' || $type === 'd') { $end = strpos($data, ';', $offset); if ($end === false) { $valid = false; return null; } $number = substr($data, $offset, $end - $offset); $offset = $end + 1; if ($type === 'b' && ($number === '0' || $number === '1')) return $number === '1'; if ($type === 'i' && preg_match('/\A-?(?:0|[1-9][0-9]*)\z/D', $number) && (string)(int)$number === $number) return (int)$number; if ($type === 'd' && preg_match('/\A-?(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[Ee][+-]?[0-9]+)?\z/D', $number) && is_finite((float)$number)) return (float)$number; } $valid = false; return null; }