ホーム‎ > ‎私の開発環境‎ > ‎

Wicketで入力フォームの情報を受け取る時の問題

http://wicket-study.seesaa.net/archives/200802-1.html

2008年02月27日

Wicketで入力フォームの情報を受け取る時の問題

どうすればよいか分からなくなってきた。。。

問題点

  • テキストエリアなどの入力フォームにHTMLタグなどを入力
  • サーバサイドでgetModelObjectAsStringで受け取る
  • HTMLエスケープされている。つまり<→&lt;のような変換が行われた状態で取得される

気に入らないのは、入力データを取得する時にエスケープされてしまう点。いわゆるサニタイジングが入力データに対して行われている。PHP(は良く知らないが)に似たような機能があったと思う。こちらのセキュリティガイドラインでもあるように出力時に行うべきだと思う。

セキュリティガイドライン
サニタイジングのタイミングは入力データのチェック時ではなく、HTMLの生成時(出力時)に行うべきです。こうしておけば、将来的にデータベースへの書 き込み手段として、メールによる投稿などの新しい方法が導入された場合でも、なんら手を加えることなく、いろんな入力源から入り込んでくるデータを漏れな くサニタイジングできることになります。

これを解消する方法として2種類の方法を見つけた
  1. コンポーネントに対してsetEscapeModelStringsをfalseにする
    もしくは、
  2. getModelObject()をStringにキャストする

1.の方法はまだ問題が残ってしまう。エスケープされずに取得することはできるのだが、今度は出力時にもエスケープされないのです。

検証

試してみる。(Wicket-1.3.1)
TextAreaをHTMLに用意。
<textarea wicket:id="textarea" cols="80" rows="3"></textarea>
このTextAreaに以下の文字列を入力して送信。(XSS想定)
</textarea>
<script language="javascript">alert("Hi!")</script>
そのままサーバサイドで入力値を受け取った結果
getModelObjectAsStringの場合→
&lt;/textarea&gt;
&lt;script language=&quot;javascript&quot;&gt;alert(&quot;Hi!&quot;)&lt;/script&gt;
※エスケープされた状態で取得される
getModelObjectの場合→
</textarea>
<script language="javascript">alert("Hi!")</script>
※そのまま

ブラウザにレスポンスされたレンダリング結果
&lt;/textarea&gt;
&lt;script language=&quot;javascript&quot;&gt;alert(&quot;Hi!&quot;)&lt;/script&gt;</textarea>
※XSSにならない。

textareaにsetEscapeModelStrings(false)としてエスケープをしないようにする
textarea.setEscapeModelStrings(false);

サーバサイドで入力値を受け取った結果
getModelObjectAsStringの場合→
</textarea>
<script language="javascript">alert("Hi!")</script>
※エスケープされない状態で取得される
getModelObjectの場合→
</textarea>
<script language="javascript">alert("Hi!")</script>
※そのまま

ブラウザにレスポンスされたレンダリング結果
</textarea>
<script language="javascript">alert("Hi!")</script>
※XSSになる!!

というわけで、2.のgetModelObjectした結果をStringにキャストするのが現実的な気がしました。でも getModelObjectAsStringなんて名前のメソッドがあったら使っちゃうよなぁ。。。

検証したソースはこちら。


ċ
wicket-sample.zip
(10k)
張文旭,
2012/03/09 12:48
Comments