Check to see if a string is serialized?

前端 未结 11 1528
情歌与酒
情歌与酒 2020-11-29 17:16

What\'s the best way to determine whether or not a string is the result of the serialize() function?

https://www.php.net/manual/en/function.serialize

相关标签:
11条回答
  • 2020-11-29 18:06

    If the $string is a serialized false value, ie $string = 'b:0;' SoN9ne's function returns false, it's wrong

    so the function would be

    /**
     * Check if a string is serialized
     *
     * @param string $string
     *
     * @return bool
     */
    function is_serialized_string($string)
    {
        return ($string == 'b:0;' || @unserialize($string) !== false);
    }
    
    0 讨论(0)
  • 2020-11-29 18:06

    There is WordPress solution: (detail is here)

        function is_serialized($data, $strict = true)
        {
            // if it isn't a string, it isn't serialized.
            if (!is_string($data)) {
                return false;
            }
            $data = trim($data);
            if ('N;' == $data) {
                return true;
            }
            if (strlen($data) < 4) {
                return false;
            }
            if (':' !== $data[1]) {
                return false;
            }
            if ($strict) {
                $lastc = substr($data, -1);
                if (';' !== $lastc && '}' !== $lastc) {
                    return false;
                }
            } else {
                $semicolon = strpos($data, ';');
                $brace = strpos($data, '}');
                // Either ; or } must exist.
                if (false === $semicolon && false === $brace)
                    return false;
                // But neither must be in the first X characters.
                if (false !== $semicolon && $semicolon < 3)
                    return false;
                if (false !== $brace && $brace < 4)
                    return false;
            }
            $token = $data[0];
            switch ($token) {
                case 's' :
                    if ($strict) {
                        if ('"' !== substr($data, -2, 1)) {
                            return false;
                        }
                    } elseif (false === strpos($data, '"')) {
                        return false;
                    }
                // or else fall through
                case 'a' :
                case 'O' :
                    return (bool)preg_match("/^{$token}:[0-9]+:/s", $data);
                case 'b' :
                case 'i' :
                case 'd' :
                    $end = $strict ? '$' : '';
                    return (bool)preg_match("/^{$token}:[0-9.E-]+;$end/", $data);
            }
            return false;
        }
    
    0 讨论(0)
  • 2020-11-29 18:06
    /**
     * some people will look down on this little puppy
     */
    function isSerialized($s){
    if(
        stristr($s, '{' ) != false &&
        stristr($s, '}' ) != false &&
        stristr($s, ';' ) != false &&
        stristr($s, ':' ) != false
        ){
        return true;
    }else{
        return false;
    }
    
    }
    
    0 讨论(0)
  • 2020-11-29 18:12

    Despite Pascal MARTIN's excellent answer, I was curious if you could approach this another way, so I did this just as a mental exercise

    <?php
    
    ini_set( 'display_errors', 1 );
    ini_set( 'track_errors', 1 );
    error_reporting( E_ALL );
    
    $valueToUnserialize = serialize( false );
    //$valueToUnserialize = "a"; # uncomment this for another test
    
    $unserialized = @unserialize( $valueToUnserialize );
    
    if ( FALSE === $unserialized && isset( $php_errormsg ) && strpos( $php_errormsg, 'unserialize' ) !== FALSE )
    {
      echo 'Value could not be unserialized<br>';
      echo $valueToUnserialize;
    } else {
      echo 'Value was unserialized!<br>';
      var_dump( $unserialized );
    }
    

    And it actually works. The only caveat is that it will likely break if you have a registered error handler because of how $php_errormsg works.

    0 讨论(0)
  • 2020-11-29 18:12
    $data = @unserialize($str);
    if($data !== false || $str === 'b:0;')
        echo 'ok';
    else
        echo "not ok";
    

    Correctly handles the case of serialize(false). :)

    0 讨论(0)
提交回复
热议问题