Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。チェックする:入力値検証ここまでで一通りの機能を備えた掲示板らしくなりましたが、あらゆる入力を許している状態です。セキュリティのためにも、入力された値の検証は欠かせません。symfonyでは入力値検証のための設定もYAMLファイルで行うようになっています。特定のアクションにおける入力値検証設定は、モジュールフォルダ内の「validate/<アクション名>.yml」ファイルを作成することによって行われます。今回は入力された値が実際にデータベースに書き込まれるupdateアクションにおいて入力値検証を行うことになります。update.ymlの作成validateフォルダ内に以下の内容の「update.yml」ファイルを作成します。下記のように、まず検証を行う入力方法(post、get、またはその両方)を指定し、次に各フィールドについて検証条件を設定します。タイトルを入力してください。使用するバリデーター。タイトル文字数が多すぎます(50文字以内)。お名前を入力してください。お名前の文字数が多すぎます(30文字以内)。name@domain.com)。http://example.com)。本文を入力してください。削除用パスワードを入力してください。削除用パスワードの文字数が少なすぎます。文字で入力してください。削除用パスワードの文字数が多すぎます。字で入力してください。各フィールド内に記述されているバリデーターは例えば以下のものが利用できますが、カスタマイズする(カスタムバリデーター)ことも可能です。カスタムバリデーターについては、次回以降で扱う予定です。同一でない場合のエラーメッセージhandleErrorUpdate関数作成(actions.class.php内追記)もしここに記された入力条件に合わない入力があった場合、アクションクラス内のhandleError<アクション名>関数が呼び出されます。'create');}この場合、再度入力してもらうべく、createアクションへフォワードしています。入力値が適正でない場合は上記handleError関数でcreateアクションへ差し戻されますが、デフォルトではエラーとなった場合にそれがどのようなエラーなのか表示されず、またそれまで入力したフォームの内容は白紙に戻されてしまいます。symfonyには「/validate/~.yml」で設定したエラー内容を表示する関数が用意されているので、入力画面上にそれを表示するようにします。それまで入力された内容も保持されるよう、テンプレート「editSuccess.php」を書き換えます。<p>投稿されたいずれかの項目が適切ではありません。下記のエラー内容を訂正し再投稿してください。:$sf_requestショートカットで前回送られたリクエストについてのエラー情報を取得し、入力されていた内容の表示には$sf_paramsショートカットを用いています。今回用いた$sf_request/$sf_paramsショートカットの関数は次のとおりです。'name'で送られてきたデータを返す実際には、次のようなエラー表示になります。入力フォームで表示されるエラーメッセージsymfonyのセキュリティについてここまでで、入力値検証を行うようになりました。HTMLタグなどの入力に対しては無防備です。これに対し入力値を一つ一つ、htmlspecialcharsなどでエスケープする必要はありません(初回はビュー出力ではないため行いましたが)。「view.yml」内に以下を追記する事で、エスケープ処理は自動的に行われます。ESC_ENTITIESstrategyの部分はエスケープ処理の対象を指定します。「both($sf_dataコンテナとローカルスコープ変数に適用)」「bc($sf_dataコンテナのみに適用)」「on(変数は$sf_dataコンテナからしか得られなくなる)」「off(エスケープ処理を行わない)」から選びます。methodの部分はエスケープ処理の方法を指定します。「ESC_RAW(エスケープ処理を行わない)」「ESC_ENTITIES(phpのhtmlentities関数を用いる)」「ESC_JS(HTMLとして使用されるであろうJavaScript文字列に埋め込まれる文字列をエスケープする)」「ESC_JS_NO_ENTITIES(JavaScript文字列に埋め込まれる文字列をエスケープするが、エンティティーは付加しない)」が選べます。$sf_dataコンテナ$sf_dataコンテナとは、テンプレート内で変数を表示するためのコンテナです。$sf_data->get['x']といったやり方が可能で、ビューにおける変数のより安全なアクセスと取り回しを実現します。$sf_data->getRaw['x']とすることで何ら処理を行わずに表示することも可能です。?>として、個々のビューで使われるタグをそのまま表示しています。不要な要素の削除ここまで、入力値検証を含め基本機能を一通り実装してきましたが、今まで残しておいたshowアクション関連や書き込み以外の編集機能、レコードを直接削除するdeleteアクションは不要なので、ここで削除します。ID表示部分のリンクをはずすscaffolding機能で自動生成したlistビューではID表示部分にshowアクションへのリンクが張られていましたが、これをはずします。返信機能に使用する「editSuccess.php」ですが、既存レコードの編集には使用しない(つまり、Objectヘルパーも使用しない)ので、関連項目を削除します。?>投稿後リストへ直接接続(executeUpdate)scaffolding機能でのUpdateアクションはshowアクションにリダイレクトされますが、これをlistアクションへのリダイレクトに書き換えます。仕上げに、showアクション/ビューとdeleteアクションを削除します。NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Technologies。執筆コミュニティ「WINGSプロジェクト」代表。