unserialize()偏移时出错 - 由单引号引起

lox*_*boi 2 php serialization escaping

我在尝试反序列化数据时遇到错误.发生以下错误:

unserialize(): Error at offset 46 of 151 bytes
Run Code Online (Sandbox Code Playgroud)

这是序列化数据:

s:151:"a:1:{i:0;a:4:{s:4:"name";s:15:"Chloe O'Gorman";s:6:"gender";s:6:"female";s:3:"age";s:3:"3_6";s:7:"present";s:34:"Something from Frozen or a jigsaw ";}}";
Run Code Online (Sandbox Code Playgroud)

该错误是由数据中的单引号引起的.当我正在使用的站点和数据库已经存在时,如何缓解此问题?不幸的是,我无法重写负责序列化和将数据插入数据库的代码.整个数据库很可能出现此问题.

有没有我可以用来逃避数据的函数?

lox*_*boi 6

在做了进一步的研究之后,我找到了解决方案.根据这篇博文:

"事实证明,如果有",",",或者; 在任何数组值中,序列化都会被破坏."

如果我在一个尚未投入使用的网站上工作,那么在base64_encode我将序列化数据存储到数据库之前就会采用一种预防方法,如下所示:

base64_encode( serialize( $my_data ) );
Run Code Online (Sandbox Code Playgroud)

然后:

unserialize( base64_decode( $encoded_serialized_string ) );
Run Code Online (Sandbox Code Playgroud)

检索数据时.

但是,由于我无法更改已存储在数据库中的内容,因此这个非常有用的帖子提供了解决问题的解决方案:

$fixed_serialized_data = preg_replace_callback ( '!s:(\d+):"(.*?)";!', function($match) {
    return ($match[1] == strlen($match[2])) ? $match[0] : 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
}, $my_data );

$result = unserialize( $fixed_serialized_data );
Run Code Online (Sandbox Code Playgroud)