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>
コメント
お世話になります。
この記事を参考にして、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で試してみますので、少々お待ちください