captcha : "日本語で質問して日本語で答えてもらう感じ"仕様に変更する
captcha モジュールのデフォルトの認証方法は「簡単な計算問題の答えを入力する」というもので、Textimage モジュールと組み合わせることで一般的な画像認証を行なうことも可能になる。
これを、日本語で質問した内容を日本語で入力させるという認証方法に変更するための方法。

captcha/captcha.module の以下の 2 つの内容について修正を加える。
* Default implementation of the captcha challenge & validation
* Default implementation of the captcha validation function.
修正によって追加された箇所とコメントアウトされた部分を強調表示しています。
/**
* Default implementation of the captcha challenge & validation
*/
function captcha_captchachallenge(&$form, &$captcha) {
$qgroup = array(
"「アイウエオ」をひらがなで。",
"優勝したらもらえるのは何メダル?",
"木が2つで林、3つなら?"
);
$agroup = array(
"あいうえお",
"金",
"森"
);
$x = rand(0,2);
$captcha_q = $qgroup[$x];
$captcha = $agroup[$x];
$form['captcha_response'] = array (
'#type' => 'textfield',
'#title' => t('Authenticate Question:Please input an answer of \"%problem\".', array('%problem' => captcha_q)),
'#description' => t("For example, What is a phonetic symbol of \"spring\" in hiragana? If it is, you input \"HARU\" in hiragana."),
'#weight' => 0,
'#required' => TRUE,
'#validate' => array('_captcha_validate' => array())
);
/*
$x = rand(1,10);
$y = rand(1,10);
$captcha = (string)($x + $y);
$form['captcha_response'] = array (
'#type' => 'textfield',
'#title' => t('Math Question: What is %problem?', array('%problem' => $x .' + '. $y)),
'#description' => t('Please solve the math problem above and type in the result. e.g. for 1+1, type 2.'),
'#weight' => 0,
'#required' => TRUE,
'#validate' => array('_captcha_validate' => array()),
);
*/
}
/**
* Default implementation of the captcha validation function.
*/
function captcha_captchavalidate(&$captcha_word, &$correct) {
$captcha_word = drupal_strtolower($captcha_word);
if (($_SESSION['captcha'] != '') && ($captcha_word == $_SESSION['captcha'])) {
$correct = TRUE;
}
else {
$correct = FALSE;
form_set_error('captcha_response', t('The answer you entered to the authenticate problem is incorrect.'));
// form_set_error('captcha_response', t('The answer you entered to the authenticate problem is incorrect.'));
}
}定義された質問集からランダムに質問が表示され、それに応じた答えを入力することで認証が行なわれる、という動作をする。
質問集と回答を追加または変更する場合は、以下の 3 点を修正する。
また、追加した t() 内のテキストを日本語化するためには、別途、翻訳を追加する必要がある。
- $qgroup = array(); の () 内に質問を追加する。
- $agroup = array(); の () 内に質問に対応する順序で答えを追加する。
- $x = rand(0,2); の 2 の部分を、問題数より 1 少ない数字に変更する。
質問と答えは特に日本語である必要はないので、目的に応じて変更できる。(ここでの目的は、海外からの bot によるスパムを防ぐこと。)
[ 参考 ]
コメントスパム対策 | Okumura's Blog
captchajp モジュール - ランダムな「ひらがな」の入力を求めるキャプチャ
captcha | Drupal-J.com - 計算の結果を全角文字で入力させるキャプチャ
captcha-j-5.x-1.2-dev.tar | Drupal-J.com - 「か行え段のひらがな」のような問題の回答を求めるキャプチャ
改定履歴
[ 2007-02-21 ]
t() 内のテキストを日本語から英語に変更しました。また、capchajp モジュールへのリンクを追記しました。
[ 2007-02-22 ]
captcha モジュールの改造を行われている Drupal-J.com へのリンクを追記しました。
[ 2007-02-24 ]
単一の質問と答えで認証を行なう方法から、ランダムに表示される複数の質問に対する答えを入力するという方法に記載内容を変更しました。
トラックバック
トラックバックは承認後に表示されます。
URLから "-nospam" を削除してトラックバックを送信してください。
コメント
内容を少し変更しました。
2007-02-24(土) 19:50 - 0829複数の問題をランダム表示できるように変更しました。
(例にあげている問題がショボイことはご勘弁ください。)
管理ページから問題を追加・変更できる機能などは、もし実装するとしたら、captchajp の方で行うと思いますが、しばらくはアップグレードなどの予定はありません。
おー(^^)//""""""パチパチ
2007-02-25(日) 01:36 - amayadori@drupa...いきなりグレードアップしましたねっ!すごいですね。
私が現実逃避(笑)している間にですね!
今私が知りたいのはモジュールとDupalとのインターフェースとかやりとりのことなんですよね。
それが全然判らないのでcaptchaモジュールやtextimageが何をやっているのか理解できないんですよ。
どこかに書いてありますかね?昔聞いた話だと本家にあるハンドブックも実際には細かいことは書いてないからそのままでは役に立たないって聞いたことがあるんですよね。今はどうなんでしょうね。
しかし、アレですね。管理画面から問題の登録とかになるとDBに触れないといけないですね(; ̄ー ̄A
filesにアップして、それを読み込むというのも手だとは思いますが(笑)安全上の問題があるかもですね?
こんな方法使っていいのかどうか判らないですけど、ロケールに保存されている翻訳文字列を使うとか(笑)
これだったら、ブラウザレベルでアップロードできるし、DBは触らなくてもいい?うーむ(T.T)やっぱあぶなそうだ・・・。
えーっと、
2007-02-25(日) 02:31 - 0829http://api.drupal.org のことでしょうか?違ってたらすみません。
あー、そんな感じっぽい
2007-02-25(日) 05:20 - amayadori@drupa...こんな感じっぽいですけど、私が理解できるまでには時間が掛かりそうだ・・・(; ̄ー ̄A
ありがとうございます。
改造しちゃいました
2007-02-20(火) 20:00 - amayadori@drupa...captcha モジュール、改造しちゃいました(; ̄ー ̄A
0829@drupal.orgさんのアイディアをヒントにオリジナルの計算結果の答えを全角で入力しなければいけないようにしました(笑)
とりあえずにその場しのぎですが(; ̄ー ̄A
多分、この程度の改造ではそう遠くない時期に破られると思うので、早くモジュールという形にしてくれる方が現れるのを祈るばかりですね。
まぁ、0829@drupal.orgさんが超音速の勢いでPHP&Drupalのプロになるというのもありですが(; ̄ー ̄A
でも、今日はこれしかやってない(; ̄ー ̄A
へなちょこですが、
2007-02-21(水) 03:23 - 0829とりあえず、2文字のひらがなをランダム表示するようにして公開してみました。
一応、複数のサーバでテストしてみて問題ないようだったのと、コードと翻訳とをコンテンツ内で紹介するのが面倒だったので...つい。