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)
该错误是由数据中的单引号引起的.当我正在使用的站点和数据库已经存在时,如何缓解此问题?不幸的是,我无法重写负责序列化和将数据插入数据库的代码.整个数据库很可能出现此问题.
有没有我可以用来逃避数据的函数?
在做了进一步的研究之后,我找到了解决方案.根据这篇博文:
"事实证明,如果有",",",或者; 在任何数组值中,序列化都会被破坏."
如果我在一个尚未投入使用的网站上工作,那么在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)
| 归档时间: |
|
| 查看次数: |
2173 次 |
| 最近记录: |