PHP会话问题 - captcha / Joomla

时间:2010-09-23 17:48:26

标签: php session joomla history captcha

我有一个Joomla组件,它调用辅助函数来创建验证码图像。当sh404被禁用时,一切正常,但是当启用sh404时,安全图像的会话变量未正确设置,因此当您提交表单时,会收到“Invalid Captcha”消息。有趣的是,如果你提交5-6次,它会验证罚款和提交。我已经尝试了我能想到的一切 - 当我回应会话变量并提交验证码时,看来会话落后了一步 - 例如:

如果我第一次提交表单并回显会话变量和提交的代码,看起来会话变量没有及时设置 - 我得到会话变量的空白值。然后我再次提交表单,会话变量是前一个验证码图像的值。这是生成和验证验证码的代码。谢谢!

//Generate Captcha image link
function Captchalink($capid = ''){
    return 'index.php?option=com_mycomponent&view=home&task=newCaptcha&capid='.$capid;
}

function generateCode($characters) {
    /* list all possible characters, similar looking characters and vowels have been removed */
    $possible   = '23456789bcdfghjkmnpqrstvwxyz';
    $code       = '';
    $i          = 0;
    while ($i < $characters) {
        $code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
        $i++;
    }
    return $code;
}

function CaptchaSecurityImages($capid = '') {

    $font       = dirname(__FILE__).DS."monofont.ttf";
    $width      = 90;
    $height     = 30;
    $characters = 6;
    $session    =& JFactory::getSession();

    //Clean buffers
    while (ob_get_level()) {
       ob_end_clean();
    }

    // start output buffering
    if (ob_get_length() === false) {
       ob_start();
    }
    $code = mycomponentHTML::generateCode($characters);

    /* font size will be 75% of the image height */
    $font_size          = $height * 0.75;
    $image              = @imagecreate($width, $height) or die('Cannot initialize new GD image stream');

    /* set the colors */
    $background_color   = imagecolorallocate($image, 255, 255, 255);
    $text_color         = imagecolorallocate($image, 20, 40, 100);
    $noise_color        = imagecolorallocate($image, 100, 120, 180);

    /* generate random dots in background */
    for( $i=0; $i<($width*$height)/3; $i++ ) {
        imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
    }

    /* generate random lines in background */
    for( $i=0; $i<($width*$height)/150; $i++ ) {
        imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
    }

    /* create textbox and add text */
    $textbox = imagettfbbox($font_size, 0, $font, $code)  or die('Error in imagettfbbox function');
    $x = ($width - $textbox[4])/2;
    $y = ($height - $textbox[5])/2;
    imagettftext($image, $font_size, 0, $x, $y, $text_color, $font , $code) or die('Error in imagettftext function');

    /* output captcha image to browser */
    header('Content-Type: image/jpeg');
    imagejpeg($image);
    imagedestroy($image);

    /* set session variable for newly created code */
    $session->set('security_code_'.$capid, md5($code));

    ob_end_flush();
    die();

}

function CaptchaValidate($capid = ''){
    $session    =& JFactory::getSession();
    if( $session->get('security_code_'.$capid) == md5(JRequest::getVar('security_code_'.$capid)) ) {
        $session->clear('security_code_'.$capid);
        return true;
    }else{
        return false;
    }
}

0 个答案:

没有答案