symfonyのエスケープ設定

symfonyにはXSS対策として、アサインした変数の値をテンプレートで利用するときにエスケープする設定があります。
しかし、この機能自体は途中で実装されたため、symfony1.0ではデフォルトではBC(後方互換モード)に設定されています。

bcモード

  • $sf_data経由で呼び出す変数はエスケープされている
  • アクションでアサインされた通常の変数はエスケープ処理されない


他にも

offモード => $sf_dataを使用しない

  • $sf_dataは利用できない
  • アクションでアサインされた通常の変数はエスケープされない

onモード => $sf_dataだけが利用可能

  • $sf_data経由で呼び出す変数はエスケープされている
  • アクションでアサインされた通常の変数はテンプレートで直接呼べない

bothモード

  • $sf_data経由で呼び出す変数はエスケープされている
  • アクションでアサインされた通常の変数もエスケープされている

というようになっています。
なんともややこしやですが。。つまりはデフォルトの設定ではなくbothを指定すべきで、エスケープされていない値が欲しいときは

$sf_data->getRaw('hoge')

とするようにすべきなんです。


と、なぜにこんな話を書いているかというと、symfony1.1ではこのエスケープ設定がonとoffの2種類になります。
ref: http://trac.symfony-project.com/changeset/8201
ref: http://trac.symfony-project.com/changeset/8260

デフォルトはoffになるそうなんですが、これがbcと同等のようです。
そして、onがbothと同等のようで、いままでのon,offとは意味合いが異なります。

というわけで、今後のescaping_strategyは

  • symfony1.0 なら both
  • symfony1.1 なら on

で開発しましょうというメモ