PDA

View Full Version : Ext.grid.EditorGridPanelのクロスサイト・スクリプティング対策



Mari
24 Jul 2009, 11:52 PM
Ext.grid.EditorGridPanelを使用して、入力可能なgridを実現しています。

入力値としてHTMLタグを入力した場合、フォーカスアウトで入力値がrenderされる際、クロスサイト・スクリプティングが発生してしまいました。
例えば、以下のサンプル画面でも再現できます。
http://extjs.com/deploy/dev/examples/grid/edit-grid.html
入力値としてBRタグなどを入力して、フォーカスアウトで発生します。
また、Submitしてしまうような内容を記述した場合でも、動作してしまいます。

render前に個別にescape処理を実装すれば、解決するとは思うのですが、みなさんどのような対策を講じていらっしゃるのでしょうか?
また、Extで何かチェックを行えるようなものは存在しますか?

よろしくお願いします。

Tommy1969
25 Jul 2009, 10:02 AM
とりあえず、renderer に Ext.util.Format.htmlEncode を指定してますねぇ…。

他にもっといい手段があったような気がするのですが、思い出せない…。:((

yuki
26 Jul 2009, 10:00 PM
この現象そのものだけでは、XSSとはならないと思います(このグリッドで入力されたデータをサーバー側で適切に処理しないとXSSになってしまいますが)。


Ext.grid.EditorGridPanelを使用して、入力可能なgridを実現しています。

入力値としてHTMLタグを入力した場合、フォーカスアウトで入力値がrenderされる際、クロスサイト・スクリプティングが発生してしまいました。
例えば、以下のサンプル画面でも再現できます。
http://extjs.com/deploy/dev/examples/grid/edit-grid.html
入力値としてBRタグなどを入力して、フォーカスアウトで発生します。
また、Submitしてしまうような内容を記述した場合でも、動作してしまいます。

render前に個別にescape処理を実装すれば、解決するとは思うのですが、みなさんどのような対策を講じていらっしゃるのでしょうか?
また、Extで何かチェックを行えるようなものは存在しますか?

この問題については英語のフォーラムでも過去に白熱した議論 (http://extjs.com/forum/showthread.php?t=13913)が交わされているのですが(クライアント側で処理するべき vs サーバー側で処理するべき vs その他)、HTMLタグを外すだけなら、Jackがここ (http://extjs.com/forum/showthread.php?p=68231#post68231)で書いているような方法でどうでしょうか?


grid.on('validateedit', function(e){
e.value = Ext.util.Format.stripTags(e.value);
});

Mari
27 Jul 2009, 1:54 AM
ご返信ありがとうございました。

たしかに、XSSと呼ぶには語弊がありますね。8-|
こちらでも、エスケープ処理を行っていまして、実際には不正なデータがサーバー側へ渡ることはありません。

しかし、rendererでのgrid表示の際、エスケープなどは行っておりませんでしたので、
<BUTTON type="button" onClick="history.back();">
などと入力した場合、カラムの中に突然ボタンが出来るなど、表示不正や、ボタンが動作する状態となってしまいました。

また、以下2つの仕様もあります。
①validationチェックは、各カラムのonblurでは無く、サーバーへリクエストする際に、一括で全てのgridカラムに対して行う。
②入力値に関しては、grid内のテキスト入力時の動作も、通常のHTMLのInputのテキストと同様の動作とする。
 (例えば、<BR>を入力した場合でも、renderer後も文字列として<BR>を表示しておくなど、一括チェックが動作するまでは、EditorGridPanelに入力した内容はそのまま表示する。)

上記仕様の為、実態値は変更せず、rendererする値のみExt.util.Format.htmlEncodeを適用する方法で実現しようと思います。
ありがとうございました。