sfFormのバリデーションエラーメッセージがエスケープされない
公式のドキュメント読みつつ sfForm を試しているのですが、何も考えずに使うとまずそうなのでメモ。
http://www.symfony-project.org/book/forms/1_1/en/02-Form-Validation
ここの例に書いてあるようにテンプレートファイルで、
<?php echo $form ?>
と書いておくと、フォームフィールドと同時にバリデーションのエラーメッセージも自動的に出力してくれるのですが、そのエラーメッセージがエスケープされないのでこのままだとXSS脆弱になってしまうっぽい。
all: .settings: escaping_strategy: true escaping_method: ESC_SPECIALCHARS
は設定しています。
先のドキュメント内の例で言うと、
<?php class ContactForm extends sfForm { public function configure() { // ... $this->setValidators(array( // ... 'message' => new sfValidatorString(array('min_length' => 4), array( 'min_length' => 'The message "%value%" is too short. It must be of %min_length% characters at least.', )), )); } }
カスタムエラーメッセージ内に「%value%」を使っている場合はアウトで、エラーメッセージ内のユーザ入力値がそのまま出力されてしまいました。
この場合は「%value%」使うなで済むかもしれないけど、もっと厄介なのはデフォルトでfalseに設定されいる「allow_extra_fields」というやつ。
バリデーションルールに登録されていないフィールドがリクエストパラメータに含まれているとエラーを出すというもので、これ自体に問題はないというか重要な機能だと思うのですが、問題はこの機能のデフォルトのエラーメッセージ。
このエラーメッセージ内には不正なフィールドの名前が含まれており、以下のようになっている(この例では「is_admin」が不正なフィールド名)
Extra field is_admin.
で、この「is_admin」の部分が「echo $form」とかやってるとHTMLエスケープされずに出力されてしまうと。
んーこれって問題にならないんでしょうかね?
ちなみに、symfony version 1.1.0 です。