同一ホスト上にHTTPとHTTPSのページが同居しているサイトをしばしばみます。
そんなサイトでは、本来はHTTPのページに、HTTPSでもアクセスできるようになっていることがあります。そういう場合、HTMLの中身によってはセキュリティ上の問題が出ますよという話です。
問題があるページ
http://www.example.jp/index.html というURLのページがあるとします。
問題となるのは、そのページの中身に以下のようなHTMLがベタ書きされている場合です。
<script src="http://www2.example.jp/foo.js"></script>
このページ(index.html)はHTTPでのアクセスを想定して作られているため、JSファイルをHTTPで読み込んでいます。
ここで、このページが実はHTTPSでもアクセス可能だとします。もしHTTPSでアクセスすると、JSファイル(foo.js)だけがHTTPで取得されることになります。そのため、JSファイルは通信系路上の攻撃者に中身を盗聴・改竄されるおそれがあります。
仮にJSファイルを改竄されてCookieを盗むJavaScriptコードが仕込まれた場合、JSファイルを読み込んでいる親ページ(index.html)はHTTPSで取得されているために、secureフラグが付いたCookieが盗まれてしまいます。
本来、ブラウザはHTTPの通信が侵害されても、同一ホストのHTTPSのコンテンツには被害がエスカレートしないように両者を分離します。Cookieで言うならば、HTTPの通信をいくら盗聴・改竄してもsecureフラグが付いたCookieは盗めないように作られています。
しかし、HTTPSのページからHTTPのJSファイルを呼び出すようなおかしなことをすると、その分離がきかなくなります。
ブラウザの対処
IEは、不完全なHTTPSのページ(HTTPSページにHTTPが混ざっているページ)に出くわした場合、セキュリティ警告ダイアログを表示して、ユーザに対してHTTPのファイルの読込みを拒否する選択肢を与えてくれます。しかし、Operaのように警告ダイアログを出さないブラウザや、Firefoxのように事後にダイアログを出す(この種の攻撃に対しては効果が無い)ブラウザもあります。
またIE、Firefox、Operaとも、不完全なHTTPSのページであることを何らかの形でユーザに伝えます。具体的には、壊れた鍵マークを表示する、鍵マークを表示しない、アドレスバーの色をHTTPのページと同じにするなどの方法がとられています。
しかし、ブラウザ(IE、Opera、Firefoxとも)は、内部的には不完全なHTTPSのページを通常のHTTPSのページと同じように扱います。つまり、secureフラグが付いたCookieの読み取りや、同一ドメインの他のHTTPSページの読み取りなどを許しています。
この辺、もう少しブラウザ側でなんとかならないかなとも思うわけですが、そもそもの話としてHTTPSページにHTTPを混ぜるというおかしなことをしているのはWebサイト側なわけで、このような問題は基本的にWebサイト側で対処するべきと捉えた方がよいと思います。
まとめ
HTTPSに関しては、しばしば以下のような「原則」が言われます。
多くのWebサイトは、上記の原則を意識して作成されているのではないかと思います。しかしそのようなサイトであっても、HTTP用のページがHTTPSでもアクセス可能になっており、結果として1の原則に反する状態になっているところもみられます。
サイトを作成する際には、事前にHTTPのみのページ、HTTPSのみのページ、HTTP・HTTPSの両方のアクセスを許容するページを定義して、それに応じたサーバ設定やHTMLのコーディングをする必要があると思います。
なお、上記ではJSファイルの改竄を取り上げて説明していますが、CSS内ではJavaScriptを実行可能なため、CSSファイルがHTTPで読み込まれている場合にもJSファイルの場合と同じ被害が発生しえます。また、攻撃の被害はsecureフラグ付きのCookieを盗られる以外にも考えられます。