フォームにまたがったトランザクション処理
前回紹介した内容で、だいぶ本格的なフォーム処理が実現できるようになってきました。本記事で最初に紹介するのは、複数のフォームにまたがったトランザクション処理を実現するためのプラグインです。
そもそも、なぜこのような仕組みが必要となるのでしょうか。Webアプリケーションは、HTTPの仕組み上ステートレスなアクセスとなるため、ユーザーの意図しないデータ登録を行うことも可能となります。これはセキュリティ上大きな問題となります。
このようなセキュリティ攻撃は、Cross site request forgeries(CSRF)と呼ばれています。
CSRF攻撃を防ぐためのCatalystのプラグインとして、以前はCatalyst::Plugin::RequestTokenが提供されていましたが、現在はCatalyst::Controller::RequestTokenとして公開されています。
RequestTokenは、Tokenを複数のフォームにまたがって共有することで、一連のトランザクションであることを保証します。サーバー側でTokenを保存するために、RequestTokenモジュールでは以前紹介したCatalyst::Plugin::Sessionを使用します。
RequestTokenをインストール/設定する
これまでの例と同様に、Catalyst::Controller::RequestTokenモジュールをインストールします。
# perl -MCPAN -e 'install Catalyst::Controller::RequestToken'
Catalyst::Controller::RequestTokenモジュールはプラグインでは無いため、アプリケーションモジュールへの登録は不要ですが、依存関係のあるCatalyst::Plugin::Sessionを使用するので、このプラグインの設定を行う必要があります。
設定箇所は次のようになります。
# 省略 use Catalyst qw/ -Debug ConfigLoader Static::Simple Session Session::State::Cookie Session::Store::File FormValidator::Simple FillInForm Unicode::Encoding /;
プラグインとして登録しない代わりに、コントローラクラスをCatalyst::Controller::RequestTokenから派生させる必要があります。
フォームにまたがったトランザクション処理を実装する
これまでの例と同様に、アクションを定義していきます。RequestTokenでは、一連の機能を実現するために2つのアクションが追加されています。
アクション名 | 説明 |
Catalyst::Controller::RequestToken::Action::CreateToken | Tokenを作成するアクション |
Catalyst::Controller::RequestToken::Action::ValidateToken | 渡されたTokenを検証するアクション |
RequestTokenの例として次のアクション、テンプレートを使用します。サンプルで追加するinputアクションでは、上記のCreateTokenとしての役割を果たすためのメソッドを呼び出しています。
種類 | 説明 |
inputアクション | 入力チェックを行うアクション |
completeアクション | 実際に登録処理を行うアクション |
input.tt | 入力テンプレート |
confirm.tt | 登録確認用テンプレート |
complete.tt | 登録完了ページ用テンプレート |
messages.yml | エラーメッセージ定義ファイル(前回の記事と同様) |