EC-CUBEにSecurimageでCAPTCHAを導入

eccube ECCUBE

eccube

EC-CUBEネタ第3弾、EC-CUBEにCAPTCHAを導入です
実際に作ったものなので動作すると思いますが、結構前にやったことなので記憶が曖昧だったり

もし動かなかったら教えてもらえれば対応します

※こちらは2.4系でのカスタマイズ方法になります
2.12系以降の方はプラグインを公開してありますのでご利用ください
EC-CUBE-CAPTCHAプラグインを作りました

Securimageの入手

こちらからダウンロードします
http://www.phpcaptcha.org/

securimage_show.phpの修正

SecurimageはSESSIONを使って認証を行うのでEC-CUBEのSESSIONを使えるようにちょこっと修正してあげる必要があります

require_once 'securimage.php';
require_once '../require.php'; //追加

$img = new securimage();

// Change some settings

//$img>image_width = 275;
//$img>image_height = 90;
//$img>perturbation = 0.9; // 1.0 = high distortion, higher numbers = more distortion
//$img>image_bg_color = new Securimage_Color("#0099CC");
//$img>text_color = new Securimage_Color("#EAEAEA");
//$img>text_transparency_percentage = 65; // 100 = completely transparent
//$img>num_lines = 8;
//$img>line_color = new Securimage_Color("#0000CC");
//$img>signature_color = new Securimage_Color(rand(0, 64), rand(64, 128), rand(128, 255));
//$img>image_type = SI_IMAGE_PNG;

$img>show(); // alternate use:  $img>show('/path/to/background_image.jpg');

※もっとオプションを設定したい人はこちらを参考にしてください
PHPでCAPTCHA(画像認証) Securimageの使い方 – hrendohの日記

必要なファイルのアップロード

securimage_show.php
securimage.php
AHGBold.ttf
words

これだけが最低限あれば大丈夫、だと思いますがsecurimage丸ごとでも全然いいと思います

SC_CheckError.phpに追記

    /**
     * CAPTCHAが正しいかチェックする
     *
     * @access private
     * @param array $value [0] => 項目名, [1] => 評価する文字列
     * @return void
     */
    function CAPTCHA_CHECK($value) {
        if (isset($this->arrErr[$value[0]])) {
            return;
        }
        $this->createParam($value);

        require_once HTML_PATH . '/securimage/securimage.php';
        $securimage = new Securimage();

        if ($securimage>check($this->arrParam[$value[1]]) === false) {
            $this->arrErr[$value[1]] = "※ " . $value[0] . " に表示された文字を再入力してください。<br />";
        }
    }

導入部分に追加

例えば会員登録の場合

LC_Page_Entry.phpのlfErrorCheck内に追記

        if ($_POST['mode'] != 'complete') {
            $objErr>doFunc(array("文字入力による認証", 'captcha_code', STEXT_LEN), array("EXIST_CHECK", "CAPTCHA_CHECK", "NO_SPTAB", "SPTAB_CHECK" ,"MAX_LENGTH_CHECK"));
        }

tplに追加

<tr>
    <th>文字入力による認証<span class="attention">※</span></th>
    <td>

        <!--{if $arrErr.captcha_code}-->
        <div class="attention"><!--{$arrErr.captcha_code}--></div>
        <!--{/if}-->
        表示されている文字を入力してください。<br />
        (大文字・小文字は問いません。)<br />

        <img id="captcha" src="<!--{$smarty.const.URL_DIR}-->securimage/securimage_show.php" alt="CAPTCHA Image" />
        <a href="#" onclick="document.getElementById('captcha').src = '/securimage/securimage_show.php?' + Math.random(); return false">更新</a>
        <br /><input type="text" name="captcha_code" size="10" maxlength="6" style="<!--{$arrErr.captcha_code|sfGetErrorColor}-->; ime-mode: disabled;"/><br />※文字がわかりにくい場合は、「更新」を押してください。
    </td>
</tr>

コメント

  1. おおさこ より:

    お世話になります。
    この記事を参考にして、2.11.4 のお問い合せページへ組み込み、テストをしています。
    しかし、正しい文字を入力しても false と判定され、何も入力しないと true と判定されてしまいます。

    テストしている環境は、以下のとおりです。

    Windows Vista Ultimate
    Apache 2.2.21
    MySQL 5.5.18
    PHP 5.3.8

    行ったことは、lc_page_contact の lfInitParam に

    $objFormParam->addParam(“文字入力による認証”, ‘captcha_code’, STEXT_LEN, ”, array(“EXIST_CHECK”, “NO_SPTAB”, “SPTAB_CHECK”, “MAX_LENGTH_CHECK”, “CAPTCHA_CHECK”));

    また、lc_page_contact の lfCheckError に

    $objErr->doFunc(array(“文字入力による認証”, ‘captcha_code’, STEXT_LEN), array(“EXIST_CHECK”, “NO_SPTAB”, “SPTAB_CHECK”, “MAX_LENGTH_CHECK”, “CAPTCHA_CHECK”));

    のそれぞれを追加。

    sc_formparamの checkError の case ‘EXIST_CHECK’: の次に case ‘CAPTCHA_CHECK’: を追加。

    sc_checkerror と tpl への追加は、記事のとおりにしました。なお、実際は、xxx_ex に追加しています。

    どこが悪いのかご教授願えたらと思います。
    よろしくお願いします。

    • のぶ より:

      コメントがスパム判定されていて気付くのおそくなりました

      おそらくは、SESSIONが上手く取ってこれていないような気がします
      2.11.4で試してみますので、少々お待ちください

タイトルとURLをコピーしました