LaravelのLaraCaptchaバンドルでスパム対策

スパム(Bot)対策にはCaptchaを導入する必要がありそうです。今日は、LaraCapthaというバンドルを試してみたいと思います。

1. コマンドプロンプトを起動して、Artisanコマンドでバンドルをインストールします。

php artisan bundle:install laracaptcha

2. 注意事項にセッションドライバーはfileに変更するように記述がありますので、session.phpの19行目を下記のように変更します。

laravel/application/config/session.php

‘driver’ => ‘file’,

セッションドライバーはcookieで無ければいいのであって、データベーステーブルでも大丈夫だと思います。

3. バンドルを追加登録します。6行目が今回の追加登録分です。

laravel/application/bundles.php

return array(
'docs' => array('handles' => 'docs'),
 'admin' => array('handles' => 'admin'),
 'swiftmailer'=>array('auto'=>true),
 'verify'=>array('auto'=>true),
 'laracaptcha'=>array('auto'=>true,'handles'=>'captcha'),
);

4. それでは実際にどのように使用するのか試してみましょう。実践編で使用しているビューファイルcreate.blade.phpを下記のように修正します。

laravel/application/views/collection/create.blade.php

@layout('layouts.master')
@section('navigation')
 <li>{{ HTML::link('collection/index','トップページ') }}</li>
@endsection
@section('content')
 {{ Form::open('collection/create','POST',array('class'=>'form-horizontal')) }}
 <fieldset>
 <div class="control-group {{ $errors->has('title') ? 'error' : '' }}">
 {{ Form::label('title','タイトル名',array('class'=>'control-label')) }}
 <div class="controls">
 {{ Form::text('title',Input::old('title')) }}
 {{ $errors->has('title') ? $errors->first('title','<p><span class="label label-important">:message</span></p>') : '' }}
 </div>
 </div>
 <div class="control-group">
 {{ Form::label('col_code','コード番号',array('class'=>'control-label')) }}
 <div class="controls">
 {{ Form::text('col_code',Input::old('col_code')) }}
 {{ $errors->has('col_code') ? $errors->first('col_code','<p><span class="label label-important">:message</span></p>') : '' }}
 </div>
 </div>
 <div class="control-group">
 {{ Form::label('save_space','保管場所',array('class'=>'control-label')) }}
 <div class="controls">
 {{ Form::text('save_space',Input::old('save_space')) }}
 {{ $errors->has('save_space') ? $errors->first('save_space','<p><span class="label label-important">:message</span></p>') : '' }}
 </div>
 </div>
 <div class="control-group">
 {{ Form::label('captcha','キャプチャ',array('class'=>'control-label')) }}
 <div class="controls">
 {{ Form::text('captcha', '', array('class' => 'captchainput', 'placeholder' => '下記の文字を入力して下さい')) }}
 {{ $errors->has('captcha') ? $errors->first('captcha','<p><span class="label label-important">:message</span></p>') : '' }}
 </div>
 </div>
 <div class="controls">
 {{ Form::image(LaraCaptcha\Captcha::img(), 'captcha', array('class' => 'captchaimg')) }}
 </div>
 <div class="form-actions">
 {{ Form::submit('新規登録',array('class'=>'btn btn-primary')) }}
 </div>
 </fieldset>
 {{ Form::close() }}
@endsection

29行目から38行目までが今回の追加箇所です。

5. collectionコントローラのcreateアクションを下記のように修正します。

laravel/application/controllers/collection.php

//新規作成createアクション
 public function action_create(){
 //もしデータが送信されたら
 if($data=Input::all()){
 //バリデーションルールの定義
 $rules=array(
 'title'=>'required|max:100',
 'col_code'=>'required|alpha_dash',
 'save_space'=>'required',
 'captcha'=>'laracaptcha|required',
 );
 $messages=array(
 'laracaptcha'=>'入力文字が正しくありません',
 );
 //バリデーションをインスタンス化
 $val=Validator::make($data,$rules,$messages);
 //バリデーションNGなら
 if($val->fails()){
 //セッションに入力値を退避する
 return Redirect::to('collection/create')
 ->with_errors($val)
 ->with_input();
 }else{
 //EloquentORMでデータの新規作成
 $create=Input::only(array('title','col_code','save_space'));
 Collection::create($create);
 //トップページへリダイレクト
 return Redirect::to('collection/index');
 }
 }
 return View::make('collection/create');
 }
  • 10行目:バリデーションルールにキャプチャを追加
  • 12~14行目:キャプチャ用のメッセージを追加
  • 16行目:バリデーションの第3引数にメッセージを追加
  • 25行目:Inputデータからcaptchaを除いたデータをセット
  • 26行目:EloquentORMでデータの新規作成

6. それでは実際に使用してみましょう。間違った文字を入力してみます。

7. 『入力文字が正しくありません。』とエラーが表示され、キャプチャ文字が変更されました。

8. 正しいキャプチャ文字を入力してみます。きちんとデータが作成されました。

9. このLaraCaptchaはほとんど設定いらずで結構簡単に使えますね。

本日は以上です。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ