HTTPリクエストヘッダが操作できてしまうのは誰が悪いのか
暗黙的に形成する事実標準の話と回避策の話を混同してはいけない(高木浩光@自宅の日記)
を読んで、なんか、いまいちわからずな感じ。Javaアプレットは良くて、Flashはよく無いというのが・・・。
特にRFCにクロスドメインでどうとか見当たらないし、RefererとリクエストURIのドメインが異なる場合、各ヘッダを特定の形にしなければならない、ということも見当たらないし*1。
規格に沿ってない、という話をするのであれば、「HTTPリクエストヘッダをおかしな値で送ってしまうブラウザが悪い」、というところまでしかいえない気がする。規格を守るなら、プラグインが変な値出しても整形すべきだと思う。
個人的には、HTTPリクエストヘッダをいじったリクエストを、ドメインを越えて送信する必要があるのか疑問なので(パラメータでやればいいし)、ドメイン越えaddRequestHeader()は「イラナイ」機能だと思う。
だけど、結局のところ、どこにもそーいった資料もないので、「イケナイ」機能とは言えないと思う。
また、過去にHTTPリクエストヘッダ操作によるXSS等の、第3者にヘッダ操作をされない限り問題にならないはずのものも結構脆弱性として報告されているようだー(from masaのメモ置き場)*2。
Expectヘッダのモノだけでもたくさんある。もし、「Expectヘッダは本来操作されるべきもので無いので直しません」ってなってたら、ヘッダ操作はダメなものとして位置付けられたかもしれない。今は、どっちなの?ってだれもわかって無い状態だと思う。
また、これに対しての、Flashの先日の修正が微妙だ。「User-Agent」、「Host」、「Referer」、「Cookie」の各ヘッダに加えて「Expect」ヘッダもブラックリスト入りした。じゃあ、他のヘッダは?「Accept-Language」や「Content-Type」で動くXSSがあるけどそれは??何がさせたいのかをはっきりして、ホワイトリストにして、任意のヘッダではなく用意された形式を選ぶようにしたらいいのに。
現段階での個人的な思いは
- ドメイン越えヘッダ操作はできていいのか悪いのかわからない
- ドメイン越えヘッダ操作が問題になるなら、ブラウザが対応すべきかもしらない
- ドメイン越えaddRequestHeader()はイラナイ
- FlashはaddRequestHeader()で何がさせたいのかわからない
- Webアプリ,サーバ側は直して(ヘッダ操作を想定して)おいたほうが安全*3
11/20追記:
ブックマークのとこに、高木さんが「JavaとFlashの違いを書いたのに、それが読解できないんじゃお話になりませんな。」と書いているけど、JavaとFlashの違いと、HTTPの規格の話は関係ないと思うのですが・・・。
RFCとか持ち出さずに、問題が起きるからダメ、問題が起きないからOK、という風に始めから議論するならばそれはそれでいいと思います。