【问题标题】:PHP: serializing and unserializing string containing escaped charactersPHP:序列化和反序列化包含转义字符的字符串
【发布时间】:2011-08-22 11:08:56
【问题描述】:

如何正确序列化和反序列化包含转义字符的字符串?

给定:

$data = "\'test\'";
$out= serialize($data);
print_r($out); // ->  s:8:"\'test\'";

这里的问题是,反序列化不接受字符串长度:

$out = 's:8:"\'test\'"';
var_dump(unserialize($out)); // -> bool(false)

但如果我将字符串长度更改为 6(忽略转义字符):

$out = 's:6:"\'test\'"';
var_dump(unserialize($out)); // -> string(6) "'test'"

它正确反序列化。

什么是处理这个问题的好方法?

【问题讨论】:

    标签: php serialization escaping


    【解决方案1】:

    我会尝试在序列化数据之前调用base64_encode(),然后在反序列化数据之后调用base64_decode()

    $data = "\'test\'";
    $out= serialize(base64_encode($data));
    var_dump(base64_decode(unserialize($out))); // -> bool(false)
    

    【讨论】:

    • 您正在以相反的顺序使用序列化和 base64_encode。当然,base64_decode 和 unserialize 也是相反的。
    【解决方案2】:

    您的测试用例不匹配,您在第一个示例中将字符串用双引号括起来,在第二个示例中用单引号括起来,导致转义字符在后者中按字面意思使用。

    $out = '\'test\'';
    

    不同于

    $data = "\'test\'";
    

    如果你这样做

    $data = "\'test\'";
    $out= serialize($data);
    print_r($out); // ->  s:8:"\'test\'";
    $data = unserialize($out);
    print_r($data); // -> \'test\'
    

    它会起作用的。

    【讨论】:

      【解决方案3】:

      问题是,您的转义字符正在由 PHP 评估。如果你想保持它们完好无损,你也应该逃避它们:) 示例:

      $out = 's:8:"\'test\'"'; // $out = s:8:"'test'"
      $out = 's:8:"\\\'test\\\'"'; // $out = s:8:"\'test\'"
      
      var_dump(unserialize($out)); // string(8) "\'test\'" 
      

      【讨论】:

        【解决方案4】:

        尝试使用json_encodejson_decode,而不是使用序列化和反序列化。后者将为您执行(取消)转义引号。

        【讨论】:

        • serialize()unserialize() 与 json 函数一样好来回工作。
        猜你喜欢
        • 2015-11-26
        • 1970-01-01
        • 1970-01-01
        • 2012-05-15
        • 1970-01-01
        • 2018-07-08
        • 2012-05-10
        • 2018-10-22
        • 2014-03-18
        相关资源
        最近更新 更多