同一生成元ポリシー:Internet Explorer方式のセキュリティ
同一生成元ポリシー(Same Origin Policy)では、あるサーバから送られたJavaScriptコードが、別のサーバ、別のポート、または別のプロトコルから送られたドキュメントのプロパティにアクセスして元のサーバに情報を返すことは禁止されます。同一生成元ポリシーはHTMLドキュメント内の機能スクリプトの実行に不可欠なJavaScript要素に作用するものであり、HTMLドキュメントのすべての要素に作用するわけではありません。同一生成元ポリシーの対象となる(生成元検査をパスしなければならない)要素は次のものです。
- document ― anchors、applets、cookies、domains、elements、embeds、forms、lastModified、length、referrer、title、URLの各メソッドおよびプロパティの読み書き。form要素の各インスタンスと、LiveConnectを通じてJavaScript関数で使用できるすべてのJava CLASSも検証されます。
- image ― lowsrcプロパティとsrcプロパティ。
- layer ― srcプロパティ。
- location ― locationで使用できるすべてのプロパティ(ただしlocation.xとlocation.yは除く)。
- window ― findプロパティ。
一般的なJavaScriptスクリプトのほとんどの機能は、この生成元検査の対象になるプロパティやメソッドを少なくとも1つは使用しなければなりません。そのため、フレーム化されたウィンドウのスクリプトに悪意を持って変更またはアクセスすることはほとんど不可能になります。
ときには、Webアプリケーションの目的を実現するために、あえて同一生成元ポリシーを犯さなければならないこともあります。この可能性に対応するために例外が設けられています。ページフレームの中に作成および表示されるページ内の情報にアクセスできるようにするには、document.domain
ステートメントを使って、そのWebアプリケーションが(ひいてはブラウザが)信頼できるドメインを指定します。例えば、「http://developer.walkthegeek.com」を生成元とするページから、「http://www.walkthegeek.com」を生成元とするページ内の変数とスクリプトエンティティにアクセスできるようにするには、関数内で次のステートメントを使用します。
document.domain = "walkthegeek.com";
このようにしてdocument.domain
プロパティを設定すると、ドメインwww.walkthegeek.comとwalkthegeek.comのすべてのサブドメイン(上記のdeveloper.walkthegeek.comなど)からのコンテンツをすべて信頼するようにブラウザに指示することになります。
データ汚染ポリシー:Netscape方式のセキュリティ
Netscapeは、インターネットユーザーを保護するにはセキュリティを強化する必要があると判断し、既存のどんなセキュリティよりも強力な新しいタイプのセキュリティを導入しました。それが「データ汚染ポリシー(Data Tainting Policy)」です。データ汚染ポリシーは同一生成元ポリシーとクライアント(ユーザー)のコンピュータの設定を組み合わせたもので、その働きは同一生成元ポリシーとほぼ同じです。データ汚染ポリシーでは、他のドメインを信頼する権限と、別のサーバから提供されたページ内のJavaScriptの変数とオブジェクトにアクセスする権限を制御します。この機能は随意にオン/オフできます。基本的にデータ汚染ポリシーがオフなら、メッセージウィンドウがポップアップして、別のドメインから提供されたページ内のJavaScriptエンティティにはアクセスできない旨が通知されます。
データ汚染ポリシーはオペレーティングシステムの一部なので、ブラウザからオン/オフすることはできません。各種オペレーティングシステムでデータ汚染ポリシーを有効にする方法は次のとおりです。
- Windowsの場合:NS_ENABLE_TAINT=1 ― Windows 3.1X、95、98、NTについてはautoexec.batファイルにこのステートメントを挿入します。Windows NTの場合、Data Taintingをユーザー環境変数として設定することもできます。
- UNIXの場合:NS_ENABLE_TAINT=1 ― 使用するUNIXシェルによって違ってきます。基本的にはset envまたはenvコマンドを使って環境変数を設定します。
- Macintoshの場合 ― Navigatorアプリケーション自体のタイプenviおよび128のリソースを編集して、NS_ENABLE_TAINTステートメントの前の2つのスラッシュを削除します。NS_ENABLE_TAINTステートメントはドキュメントの終わり近くにあるはずです。
- OS/2の場合:NS_ENABLE_TAINT=1 ― 起動ドライブのルートにあるconfig.sysファイル内にこのステートメントを設定します。
データ汚染ポリシーが作用するのはNetscape Navigatorのみです。データ汚染ポリシーは同一生成元ポリシーとほぼ同様の働きをします。つまり、すべてのページ要素の生成元がテストされるわけではなく、次のようなJavaScriptスクリプトに必須の部分だけがテストされます。
- document ― cookie、domain、lastModified、links、referrer、title、URLの各プロパティ
- form ― form要素のすべてのインスタンス
- history ― current、next、previous、toStringの各メソッドおよびプロパティ
- link ― hash、host、hostname、href、pathname、port、protocol、search、toStringの各メソッドおよびプロパティ
- location ― hash、host、hostname、href、pathname、port、protocol、search、toStringの各メソッドおよびプロパティ
- option ― defaultSelected、selected、text、valueの各メソッドおよびプロパティ
- plugin ― nameプロパティ
- window ― defaultStatus、name、statusの各メソッドおよびプロパティ
上記のすべてについて生成元がテストされます。taintEnabled()
メソッドを使用すると、データ汚染ポリシーが有効になっているかどうかをテストすることができます。このメソッドは、データ汚染ポリシーが有効ならばtrueを返し、有効でなければfalseを返します。テスト対象にするスクリプト要素を指定することもできます。なお、データ汚染ポリシーはバージョン1.1以前のJavaScriptでしか使用できないことに注意してください。バージョン1.2以降のJavaScriptでは、データ汚染ポリシーとは違うタイプのセキュリティが使われています。それが次に説明する「署名付きスクリプト」です。