エスケープ
[SASTRUTS-104] チュートリアルのJSPのtaglibを使ってない箇所のXSS防止の対応をしました - The Seasar Foundation Issues (Deprecated)
入出力項目のエスケープですが、ポリシーとしては、入力項目かどうかによらず、出力時にはエスケープすべきです。
SAStrutsの機能リファレンスにありますが、基本的には$(f:h()}
で囲うことになります。
JSP2.0脳になりきれてないので、ELとtaglibの評価の順番をいまいち押さえてないのですが、ELの値の展開は多分JSPがサーブレットにコンパイル済みの状態で実際に呼び出されたタイミングで行われるのだとおもうので、そうであればStrutsのhtml:textタグなどでは、デフォルトでエスケープが行われるので問題なし。
逆にそれ以外の以下のようなケースではエスケープが行われないので、明示的にf:h()
が必要です。
- その他のtaglib(Strutsのtagの場合、ものによってデフォルトでエスケープが行われるものとそうでないものがあります。)
- taglib以外の部分(
<
〜>の外)- taglibでないふつうのHTMLタグがこれに含まれます。よって
html:text
でなくinput
を使ってフォームのテキストボックスを表現しているような場合は、その値の部分は必ずエスケープが必要です。
- taglibでないふつうのHTMLタグがこれに含まれます。よって
エスケープ不要:<html:text name="foo" value="${foo}" /> エスケープ必要:<html:submit name="bar" value="${f:h(bar)}" /> エスケープ必要:bazは${f:h(baz)} エスケープ必要:<input type="text" name="baz" value="${f:h(baz)}">
精査してないので間違っていたらすみません。
もうこんな時間・・・眠気に負けました。
追記 今気がつきましたが、いつのまにかtutorialからemployeeの例がなくなっている・・