假的测试不适用于反序列化

时间:2016-09-22 06:40:56

标签: php

我想在输入要解密的输入字符串后提交表单时解密字符串:

    static function decrypt($data) {
        $key = 'AVtr34EN';
        $td = mcrypt_module_open(MCRYPT_DES,"",MCRYPT_MODE_ECB,"");
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        mcrypt_generic_init($td,$key,$iv);
        $data = mdecrypt_generic($td, base64_decode($data));
        mcrypt_generic_deinit($td);

        if (substr($data,0,1) != '!')
            return false;

        $data = substr($data,1,strlen($data)-1);
        return unserialize($data);
    }

当我调用此函数时,参数值为:

zeL1smxhfIEMWCews6vb1Y8yFa5tHbB3b489X0R3QtA=

然后我什么都没得到!

我做了一个测试if ( utils::decrypt($data_) === false ),但程序没有进入if!

的块中

那么如何对待这个案子?

1 个答案:

答案 0 :(得分:0)

你给字符串zeL1smxhfIEMWCews6vb1Y8yFa5tHbB3b489X0R3QtA=并使用这个andsandboxing PHP它完全按照预期工作:

static function decrypt($data) {
    $key = 'AVtr34EN';
    $td = mcrypt_module_open(MCRYPT_DES,"",MCRYPT_MODE_ECB,"");
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td,$key,$iv);
    $data = mdecrypt_generic($td, base64_decode($data));
    mcrypt_generic_deinit($td);

    //$data = "!s:20:"2�Y:H���6|1|2|1|2|4";���"

    if (substr($data,0,1) != '!')
        return false;

    // If will never be reached in this case,
    // as data first character does equal "!" 

    $data = substr($data,1,strlen($data)-1);
    return unserialize($data); //"2�Y:H���6|1|2|1|2|4"
}

请澄清你的问题。将inpt字符串更改为"FDHFDHeh"(或其他)正确返回false,显示IF语句被触发。

注意:

您正在使用输入$data变量,但之后还在函数中生成了一个新的$data变量,这是一个不好的做法,让两个不同的东西具有相同的名称,并通过注释判断这是导致我,如果不是你,混乱。

此外,您可以将substr简化为$data = substr($data,1);,因为您从字符1开始,字符串长度为strlen($data)-1

建议你改写:

 static function decrypt($data) {
        $key = 'AVtr34EN';
        $td = mcrypt_module_open(MCRYPT_DES,"",MCRYPT_MODE_ECB,"");
        $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
        mcrypt_generic_init($td,$key,$iv);
        $decryptData = mdecrypt_generic($td, base64_decode($data));
        mcrypt_generic_deinit($td);

        if (substr($decryptData,0,1) !== '!'){
            //re: comments below:
            //using !== makes it a strict type comparison 
            return false;
            }

        $outputData = substr($decryptData,1);
        return unserialize($data);
    }

使用mb_string函数可能也值得。

您还可以使用数组重写字符串比较(因为字符串是字母数组),因此,将if(substr(...))替换为:

if ($decryptData[0] !== '!')
            return false;

这意味着"如果变量$decryptData的第一个字符不是"!" 则返回false。