引数として何かのURLを受け取って、そのURLにただ飛ばすという処理をセキュアに書くのは案外チェック項目が多くて大変だったのでメモ。
・引数が正しいURL形式かチェック
・オープンリダイレクタにならないように、引数として渡されたURLが飛び先として想定内のURL(自ドメイン範囲内かなど)かチェックする。
・オープンリダイレクタを使ったURL偽装に引っかかるのは善意の第三者ユーザなので、リファラが消えていないケースが多いことを考えると、補助的な対策として、リファラに何か値があったら、想定範囲内のURLかチェックし、知らないURLから飛んできてたらエラーにするというのもありかも。
・HTTPヘッダで外部から渡されたURLにリダイレクトする場合は、URLから改行コードを削除する必要がある(HTTPヘッダインジェクション対策)。
・metaタグのrefreshに指定するURLは、IE6/7だと;で区切ってURLが複数指定できてしまい、後に指定したほうのURLに飛ぶので注意。
(参考 葉っぱ日記 IE6/7のでは「;」で区切ってURLが複数指定できる問題)
・Javascriptでページを遷移させる場合、Javascriptの文字リテラルに外から渡された引数を渡すのは穴が潰しにくくて危険。Javascript文字列としてのエスケープを行う必要があるが、安全な書き方がなかなか難しく、うっかりするとJavaScriptインジェクションを食らってしまう。
(var val='{$URL}'; みたいなのは危険。)
HTML特殊文字エスケープ後、HTMLフォームのhiddenインプットに値を入れて、それをJSから参照する形にすると楽。
(参考 ockeghem(徳丸浩)の日記 XSS対策:JavaScriptのエスケープ(その3))
まだあったりするかな・・
→まだたくさんあった。
オープンリダイレクト検査:Locationヘッダ編 - T.Teradaの日記
まだあったりするだろうか。
Powered by Blogger.