0

我有一个 nu_soap Web 服务,我想用它创建和发送验证码和图像。

我正在使用getcaptchaWeb 服务将生成的 Captcha 代码放入会话变量和 Captcha Id 中,并使用另一个名为的 Web 服务:validateCaptcha 我正在检查它是否有效,

问题是当我使用 Firefox Soa 客户端插件检查我的 Web 服务时,Web 服务工作正常并且所有会话变量工作正常。

但是当我尝试使用 android 手机检查它时,会话变量未定义或为空。

获取验证码:

<?php
session_start();
include_once('./Utility/DBM.php');
include_once('captcha.class.php');

class getCaptcha extends DBM
{
    public function getcaptchacode($dump)
    {
        //creating and generating captcha image and code
        $img = createcaptcha();

        //Creating Captcha Id
        $CaptchaId = (mt_rand(1,1000) . "1234");

        imagepng($img[0],'Captcha/'.$CaptchaId.'.png');
        imagedestroy($img[0]);


        //encoding to base64 and getting file content
        $base64 = base64_encode(file_get_contents('./Captcha/'.$CaptchaId.'.png'));

        //setting up session for captcha
        $_SESSION['Captcha_Code']=$img[0];
        $_SESSION['Captcha_ID']=$CaptchaId;

        $img[]='';

        $captcha=$base64;
        $captchaId = $CaptchaId;

        $this->strResult = "";


            $this->strResult.="<captcha>";
            $this->strResult.="<captcha>$captcha</captcha>";
            $this->strResult.="<captcha_Id>$captchaId</captcha_Id>";
            $this->strResult.="</captcha>";

    }


    function __toString()
    {
        if($this->strResult!=""){
            return $this->strResult;
        }
        return "";
    }


}

?>

验证验证码:

<?php
session_start();
include_once('./Utility/DBM.php');

class validateCaptcha extends DBM
{
    public function validatecaptcha($CaptchaCode,$Captcha_Id)
    {
        if(($CaptchaCode!=""&&$CaptchaCode==$_SESSION['Captcha_Code'])&&($Captcha_Id!=""&&$Captcha_Id==$_SESSION['Captcha_ID']))
        {
             $msg="Captcha is correct";
            //generating a Token using md5 & salt
            $hash = md5(mt_rand(1,1000000) . "123456");
            $token=$_SESSION['CapToken'] = $hash;

            //starting token session time
            $_SESSION['Token_time'] = time();

            //destroying captcha image
            unlink('./Captcha/'.$Captcha_Id.'.png');
        }
        else
        {
            //destroying captcha image
            unlink('./Captcha/'.$Captcha_Id.'.png');

            //destroying all session
            //session_destroy();

            $msg="Wrong Captcha Entered";
            $token="";

        }

        $this->strResult = "";


            $this->strResult.="<captcha>";
            $this->strResult.="<captcha>$msg</captcha>";
            $this->strResult.="<token>$token</token>";
            $this->strResult.="</captcha>";


    }


    function __toString()
    {
        if($this->strResult!=""){
            return $this->strResult;
        }
        return "";
    }


}

?>
4

1 回答 1

0

我找到了解决这个问题的方法,我想把它贴在这里供其他人使用。

我没有使用会话变量,而是使用 mysql 数据库来存储验证码(id、code、token、expire_time)然后我使用 php date() 函数来检查验证码时间是否未过期并且它是有效的,并且在验证 Web 服务中我使用 mysql 来选择从 db 检查验证码是否有效。

验证码 :

class validateCaptcha extends DBM
{
    public function validatecaptcha($CaptchaCode,$Captcha_Id)
    {
        $select_captcha = $this->select("captchaid,code,token,expire", "captcha", "code='$CaptchaCode' AND captchaid='$Captcha_Id'", 0, 0);
        $captcha_check=mysql_num_rows($select_captcha);
        $row = mysql_fetch_assoc($select_captcha);

        if($captcha_check)
        {
             $msg="Captcha is correct";
             $token=$row['token'];

            //destroying captcha image
            unlink('./Captcha/'.$Captcha_Id.'.png');
        }
        else
        {
            //destroying captcha image
            unlink('./Captcha/'.$Captcha_Id.'.png');

            $msg="Wrong Captcha Entered";
            $token="";

        }

        $this->strResult = "";


            $this->strResult.="<captcha>";
            $this->strResult.="<captcha>$msg</captcha>";
            $this->strResult.="<token>$token</token>";
            $this->strResult.="</captcha>";


    }

获取验证码:

class getCaptcha extends DBM
{
    public function getcaptchacode($dump)
    {
        //creating and generating captcha image and code
        $img = createcaptcha();

        //Creating Captcha Id
        $CaptchaId = (mt_rand(1,1000) . "1234");

        imagepng($img[0],'Captcha/'.$CaptchaId.'.png');
        imagedestroy($img[0]);


        //encoding to base64 and getting file content
        $base64 = base64_encode(file_get_contents('./Captcha/'.$CaptchaId.'.png'));

        //generating a Token using md5 & salt
        $hash = md5(mt_rand(1,1000000) . "123456");
        $token=$_SESSION['CapToken'] = $hash;

        //Getting time
        $getime=date('Y-m-d H:i:s');

        //inserting into captcha table
        $this->RunQuery("INSERT INTO captcha (captchaid,code,token,expire) VALUES ('$CaptchaId','$img[1]','$token','$getime')", true, false);//TODO query
        if (mysql_insert_id())
            $Response = 'True';
        else
            $Response = 'False';

        //deleting inactive captcha for 15 minutes
        $this->RunQuery("DELETE FROM captcha WHERE expire < DATE_SUB(NOW(), INTERVAL 15 MINUTE)",true,false);

        $img[]='';
        $captcha=$base64;
        $captchaId = $CaptchaId;

        $this->strResult = "";


            $this->strResult.="<captcha>";
            $this->strResult.="<captcha>$captcha</captcha>";
            $this->strResult.="<captcha_Id>$captchaId</captcha_Id>";
            $this->strResult.="<Response>$Response</Response>";
            $this->strResult.="</captcha>";



    }
于 2015-06-24T09:19:26.010 回答