解决的方法也很简单: 修改 文件 e/class/connect.php....
3660 //设置验证码 3661 function ecmsSetShowKey($varname,$val,$ecms=0){ 3662 global $public_r; 3663 $val=md5($val); 3664 $time=time(); 3665 $checkpass=md5(md5($val.'EmpireCMS'.$time).$public_r['keyrnd']); 3666 $key=$time.','.$checkpass; // 原来为 $key=$time.','.$checkpass.','.$val; 3667 esetcookie($varname,$key,0,$ecms); 3668 } 3669
还有一个地方: function ecmsCheckShowKey($varname,$postval,$dopr,$ecms=0){ 3672 global $public_r; 3673 $r=explode(',',getcvar($varname,$ecms)); 3674 $cktime=$r[0]; 3675 $pass=$r[1]; 3676 $val=$r[2]; //请注释掉这一句 3677 $time=time(); 3678 if($cktime>$time||$time-$cktime>$public_r['keytime']*60) 3679 { 3680 printerror('OutKeytime','',$dopr); 3681 } 3682 if(empty($postval)) // 原来为 if(empty($postval)||md5($postval)<>$val) 3683 { 3684 printerror('FailKey','',$dopr); 3685 } 3686 $checkpass=md5(md5(md5($postval).'EmpireCMS'.$cktime).$public_r['keyrnd']); 3687 if($checkpass<>$pass) 3688 { 3689 printerror('FailKey','',$dopr); 3690 } 3691 }
这样,密文就只有$checkpass和明文 $time,三次md3加密后反查难度非常大 还可看到,密钥$public_r['keyrnd']非常重要,如果不慎泄漏,则完全可以伪造cookie突破验证码。
|