Kenji Suzuki
kenji****@gmail*****
2011年 6月 21日 (火) 14:35:17 JST
Kenji です。 On Wed, 8 Jun 2011 10:26:34 +0900 Yoshiyuki Okamoto <okamo****@gmail*****> wrote: > お世話になっております。 > 岡本です。 > > Kenjiさんの考え方に賛成します。 > 私も関数名は違いますが、松尾さんと同じやりかたです。 > > ただview変数にHTMLタグを渡すケースでエスケープ漏れが発生してしまいます。 > 外注時に結構発生していました。(泣) 出力時の XSS 対策処理全般について記事を書きました。 http://d.hatena.ne.jp/Kenji_s/20110621/1308632827 > global_xssフィルタリングの考え方もいいと思っています。 > ただ、管理画面などでタグ入力を扱う場合に困るので、 > CI_Inputのコンストラクタをオーバーライドして、global_xssフィルタリング用configを作成し、config記載した特定パスだけはずすという対処をしています。 global xss フィルタリングはやはりちょっと使い勝手が悪いように 思いますね。 また、個人的には、CI の XSS フィルタは廃止の方向にしたほうが いいかなと思います。フィルタリング漏れが起こらない保証はないですから。 > その他ついでに、希望を書きますと、入力フィルタリングもホワイトチェックとしたいです。 > Firewall設定みたいに基本NGルールを適用して、許可ルールだけ追加するイメージです。 > 下記実装したいと考えていました。 なるほど。デフォルトでフィルタリングというのは考えたことありませんでした。 この場合、バリデーションはどうされるのでしょうか? --------------------------------------------------------------------------------------------------------------------------------- > (1)Inputクラスの入力値取得メソッドにて許可文字列以外取得できないようにする。 > xss_cleanもデフォルトでTRUEとする。 > > <Inputクラス実装イメージ> > function post($index = NULL, $xss_clean = TRUE, $allow_pattern = > '/^[0-9a-zA-Z_\-]+$/D') > > <入力値取得イメージ> > //標準では/^[0-9a-zA-Z_\-]+$/D のみしか取得できない。 > $param1 = $CI->input->post('param1'); > > //引数追加すれば、他の文字も取得できる。KANJI_JIS_DAI_ICHI_DAI_NIは別途で定義する。 > $kanji = $CI->input->post('kanji', TRUE, KANJI_JIS_DAI_ICHI_DAI_NI); > > //ALLを引数に追加すれば、なんでもOK。ALL > $kanji = $CI->input->post('kanji', TRUE, ALL); > > //NG文字があった場合にどうするかは、設定ファイルに定義する。 > (NG文字だけ除去する or 例外をスローする or NULLを返す etc) > > (2)フレームワークにより、グローバル変数$_POST, $_GET, $_COKKIEを直接参照できないようにする。 > 必ずinputクラスを通して入力値を取得する。ファイルアップロード,URI,環境変数も同様。 > > (3)コントーローラーの公開メソッドの引数に渡される入力値について、引数で渡さない。inputクラス経由でしか取得できないようにする。 > > > --------------------------------------------------------------------------------------------------------------------------------- > > > このような対処により、結果的にxssの防止にもなるかなと思いまして。 > 入力フィルタリングを徹底したうえで、なおかつ出力時エスケープも徹底するというのがいいと思います。 そうですね。入力でのチェックと出力でのエスケープは別途わけて考えて、依存しない 方が漏れも減るでしょうから好ましいですね。 // Kenji > 長々すみません。 > なにかあればまた投稿します。 > > > > > 2011年6月8日8:56 松尾大 <info****@local*****>: > > @localdiskです。 > > > > twitter でもつぶやきましたが CI の XSS 対策は現状使いものにならないと思います。 > > ([removed]って…) > > > > 自分の場合は自作helperに以下の関数を作成しています。 > > > > if (!function_exists('h')) { > > > > function h($str) { > > $CI = get_instance(); > > return htmlspecialchars($str, ENT_QUOTES, $CI->config->item('charset')); > > } > > > > } > > で使うときは <?= h($str) ?> という感じです。 > > > > kenjiさんの下記の実装方針には賛成です。出力時にエスケープしてくれる > > のは楽といえば楽ですもんね。 > > > > 2011年6月8日8:19 Kenji Suzuki <kenji****@gmail*****>: > >> Kenji です。 > >> > >> > >> あまり情報や議論がないので CI の XSS 対策についての一つの実装案の記事を書きました。 > >> http://d.hatena.ne.jp/Kenji_s/20110606/1307354630 > >> > >> CI の XSS 対策についてのまとまった解説はあまりなく、個人的には、ユーザガイド > >> のセキュリティの記述も不完全だと思っています。 > >> http://codeigniter.jp/user_guide_ja/general/security.html > >> > >> 英語での議論もいくつかありますが、改善する方向には盛り上がっていません。 > >> http://blog.astrumfutura.com/2011/05/codeigniter-2-0-2-cross-site-scripting-xss-fixes-and-recommendations/ > >> http://codeigniter.com/forums/viewthread/188698/ > >> > >> > >> ということで、手始めに CI での XSS 対策について、例えば、私はこのように対策して > >> いるとか、CI はこのように改善すべきだとか、意見交換ができたらと思います。 > >> > >> > >> // Kenji > >> > >> _______________________________________________ > >> Codeigniter-users mailing list > >> Codei****@lists***** > >> http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users > >> > > > > > > > > -- > > _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ > > MATSUO Masaru > > info****@local***** > > http://www.localdisk.org/ > > http://twitter.com/localdisk > > _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ > > > > _______________________________________________ > > Codeigniter-users mailing list > > Codei****@lists***** > > http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users > > > > _______________________________________________ > Codeigniter-users mailing list > Codei****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/codeigniter-users