reCapchaとは別の認証方式の開発

reCapchaとは別の認証方式の開発

- Tatsuya Shirai の投稿
返信数: 2

 ロシアからの攻撃 で話題に出した件です.

 reCapchaによる認証箇所は,login/signup_form.phpの

function definition()

        if (signup_captcha_enabled()) {
            $mform->addElement('recaptcha', 'recaptcha_element', get_string('recaptcha', 'auth'), array('https' => $CFG->loginhttps));
            $mform->setHelpButton('recaptcha_element', array('recaptcha', get_string('recaptcha', 'auth')));
        }

と,function validation()の

        if (signup_captcha_enabled()) {
            $recaptcha_element = $this->_form->getElement('recaptcha_element');
            if (!empty($this->_form->_submitValues['recaptcha_challenge_field'])) {
                $challenge_field = $this->_form->_submitValues['recaptcha_challenge_field'];
                $response_field = $this->_form->_submitValues['recaptcha_response_field'];
                if (true !== ($result = $recaptcha_element->verify($challenge_field, $response_field))) {
                    $errors['recaptcha'] = $result;
                }
            } else {
                $errors['recaptcha'] = get_string('missingrecaptchachallengefield');
            }
        }

未確認ですが,赤で示した認証確認がtrueならば$errors['recapcha']に何も値を入れずに処理が終わります.つまりsignup_captcha_enabled()がtrueで$error['recapcha']がemptyならば認証されたということでしょう.ゴッソリと入れ替えることで独自のreCapchaモドキを導入できそうです.

Tatsuya Shirai への返信

Re: reCapchaとは別の認証方式の開発

- Tatsuya Shirai の投稿

 画像をたとえば100枚作成します.縦のサイズは共通で横幅はある程度の自由度を持たせます.pic001.jpgからpic100.jpgとしましょう.各画像ファイルが何のカテゴリに該当するのかをテキストファイルに事前に記録しておきます.pic001.jpgは”ドラえもんの登場人物",”動物”,pic002.jpgは”サザエさんの登場人物”,”人物”,”男性”,など.複数の属性を持たせると沢山の設問をランダムに出題できますね.

 まず画像を100個の中から4個選んで一時フォルダーにコピーして一枚の画像に連結します.(高木氏のブログ参照,三井住友VISAのcapchaモドキの二の轍を踏まない).連結した画像の下に4つのチェックボックスを表示する.画像の横幅がそれぞれ微妙に違うとするとチェックボックスがきちんと図の真下に来ないかも知れないが,そこは大目に見てもらう.

 選ばれた画像の持つ属性の中からランダムに一つの属性を選び,質問とする.これで”ゼロ・ゲイツ状態”は回避できる.もし選んだ属性が”男性”だとすると,設問は”以下の画像のうち男性を選んで下さい”と表示する.”のび太”は男性だし,”タマ”は人間ではなくてネコだが,”ドラえもん”はどっちだ?という程度の混乱は我慢する.

 ユーザがチェックボックスをクリックして選択した画像が全て”男性”の属性を持ち,クリックしなかった画像が全て”男性”の属性を持たないならば認証に合格とする.

 ”ゼロ・ゲイツ状態”は無いとしているので,4枚の画像からなる設問にランダムに答えて,偶然,認証が合格する確率は1/15(0000bを除く0001bから1111bの中から一つ).この確率は高いと見るか低いと見るか?


 何も選択しないでOKを押すのは心理的にイヤであろうと思って”ゼロ・ゲイツ状態”を省いていますが,一つもチェックボックスをOnにしなくても良いならば1/16ですね.

Tatsuya Shirai への返信

Re: reCapchaとは別の認証方式の開発

- Tatsuya Shirai の投稿

 仕組みさえできてしまえば,あとは画像ファイル集と,画像のファイル名とその属性の対応を記述したテキストファイルを入れ替えれば良い.古典アニメCapchaパック,人物Capchaパック,動物Capchaパック,萌え系Capchaパック,自動車Capchaパックなど,そのMoodleサイトを利用する方の対象に合わせて好きなパックを利用すれば良いでしょう.

 複数のCapchaパックを用意しておき,ユーザの方に選んで頂いても良いでしょう.ただ,「そこまで凝ることか?」という気もしますが...


 設問を生成する元になる画像の属性に関しては多言語対応のためにget_string()に対応した言語パックも用意する必要がありますね.