我想在输入要解密的输入字符串后提交表单时解密字符串:
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!
那么如何对待这个案子?
答案 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。