zend_captchaをいじってみた

( PHP )

やっぱ、コメントスパムってなくならないよねーと騒がれるこのご時世。

対策の一環として一つの施策を行いました。

そう、その名もキャプチャ認証。チャララリン。

今回はZendのコンポーネントに画像認証用のものがあったのでそれを利用してみることにしました。

下準備として以下の条件が必要になります。 ・GDは利用できるかどうか ・画像を保存するディレクトリは実行権限が「7」で設定されているか

早速実装です。以下が画像と承認用のIDを生成する設処理です。

        //-----------------------------------
        // キャプチャ画像生成
        //-----------------------------------
        $imgUrl = "hogehoge";
        $imgDir = "hogehoge";
        $config = array('timeout' => 300,
                        'wordLen' => 6,
                        'width'   => 110,
                        'height'  => 50,
                        'lineNoiseLevel' => 3,
                        'dotNoiseLevel' => 3,
                        'fontSize' => 26,
                        'font'    => '/usr/share/fonts/ja/TrueType/kochi-mincho-subst.ttf',
                        'imgUrl'  => $imgUrl,
                        'imgDir'  => $imgDir
            );
        $captcha = new Zend_Captcha_Image( $config );
        $captcha->generate();   //command to generate session + create image

        $this->view->captchaId      = $captcha->getId();
        $this->view->captchaImgTag  = $captcha->render(); // generate Image Tag

簡単です、設定をちょろちょろしてからインスタンス生成、「generate()」で画像生成。これでロジック部分は終了。

次はHTML部分です。確認用のID情報はセッションに保存され、それをもとに値をチェックするようになります。

{* テンプレートエンジンはSmartyを使っています。 *}

{$captchaImgTag}

後は、入力した値のチェックを行う部分です。 チェックを行う際にはValidatorを作成してセッションに値と正しいかのチェックを行います。

    public function isValid($value)
    {
        $captchaId          = $value['id'];
        $captchaInput       = $value['input'];
        $captchaSession     = new Zend_Session_Namespace('Zend_Form_Captcha_' . $captchaId);
        $captchaIterator    = $captchaSession->getIterator();

        if( isset($captchaIterator['word'])
            && $captchaInput == $captchaIterator['word'] ) {
            return true;
        }
        else {
            return false;
        }
    }

以下のコードで複数画面操作していても別の画面で生成された値を利用しなくて済むようになります。

        $captchaSession     = new Zend_Session_Namespace('Zend_Form_Captcha_' . $captchaId);

なんか書いてみたけどチェック用のメソッドがあったのが後々になって気づきました。無念。

「Zend_Captcha_Image::validateCaptcha();」 まぁそんなかわらんからえええか

画像がこんな感じで出力されます。

まぁ、そんなこんなで簡単に実装ができるとさ。

ノイズもあるメソッドをごりごりいじればもっと複雑かつ面白くできるのだが今回はここまで。

■参考URL Tutorial: Using Zend_Captcha_Image

mage