1,944 views
この記事は最終更新から 2261日 が経過しています。
このブログでは、SI Captcha Anti-Spam なるプラグインを使用している。
このプラグインを使うと、ログイン時にランダム生成されたキャプチャーコードの入力を求められるようになる。スパム対策として期待している。
プラグインやウィジェットを何個か作ってちょっとだけ WordPressの思想というかメカニズムがわかってきたので、これに似たものを作ってみようと思う。
■やりたいこと
・ログインフォームの「ユーザー名」、「パスワード」入力欄の下に、独自入力項目を追加する。
・独自入力項目にはランダム生成した 4桁の数字を表示し、これの入力を求める。
■プログラム
以下の2つの関数をフックする。
login_form : ログインフォームを表示時に実行
wp_authenticate_user : ユーザー認証時に実行
ほぼほぼ最小形のコードだと思う。
<?php /* Plugin Name: MySecurityLogin */ //////////////////////////////////////////////////////////////////////// add_action('init', 'my_session_start'); function my_session_start(){ if("" == session_id()){ session_start(); } } //////////////////////////////////////////////////////////////////////// if (class_exists('MySecurityLogin')) { $obj = new MySecurityLogin(); } //////////////////////////////////////////////////////////////////////// class MySecurityLogin { ////////////////////////////////////////////////////////////////////// public function __construct() { add_action( 'login_form', array($this, 'proc_add_login_field')); add_action( 'wp_authenticate_user' , array($this, 'proc_authenticate'), 30, 1); } ////////////////////////////////////////////////////////////////////// public function proc_add_login_field() { $_SESSION['MySecurityLoginOTT'] = $ott = sprintf("%04d", rand(0,9999)); echo <<< EOM <p style="background:#ada;font-size:2rem;text-align:center">{$ott}</p> <input type="text" name="add_sec_code" class="input" value="" /> EOM; } ////////////////////////////////////////////////////////////////////// public function proc_authenticate( $user ) { if(FALSE === isset($_SESSION['MySecurityLoginOTT'])){ goto tagErr; } if(FALSE === isset($_POST['add_sec_code'])){ goto tagErr; } if($_SESSION['MySecurityLoginOTT'] != $_POST['add_sec_code']){ goto tagErr; } return $user; tagErr: return new WP_Error(); } } ?>
なんかそれっぽいのができた。
間違った値を入れるとログインできないことを確認した。
正しい値を入れるとログインできることを確認した。
今後は…
今のままだとスパムプログラムがテキストを読んで自動入力してしまうだろう。
前述の SI Captcha Anti-Spam のように自動認識が難しい画像にする必要があるだろう。
そのうちにやってみよう。