許可リスト

ドメイン許可リストは、アプリケーションが制御できない外部ドメインへのアクセスを制御するセキュリティモデルです。Cordovaは、アクセスできる外部サイトを定義するための構成可能なセキュリティポリシーを提供します。

デフォルトでは、新しいアプリは任意のサイトへのアクセスを許可するように構成されています。アプリケーションを本番環境に移行する前に、特定のネットワークドメインとサブドメインへのアクセスを提供する許可リストを作成する必要があります。

独自の許可リストプラグインを実装することは可能ですが、アプリが非常に特定のセキュリティポリシーを必要としない限り、推奨されません。

ネットワークリクエスト許可リスト

Cordovaは、アプリの最上位ディレクトリにある`config.xml`ファイル内の`<access>`要素に依存するW3Cウィジェットアクセス仕様に準拠しています。

これは、特定のドメインへのネットワークリクエスト(画像、XHRなど)の送信が許可されているかどうかを制御します(cordovaネイティブフック経由)。

注意:より安全なコンテンツセキュリティポリシー(CSP)(下記参照)を使用することをお勧めします。このネットワークリクエスト許可リストは、主にCSPをサポートしていないWebViewのための歴史的なものです。

`config.xml`で、次のように`<access>`タグを追加します

<!-- Allow images, xhrs, etc. to google.com -->
<access origin="http://google.com" />
<access origin="https://google.com" />

<!-- Access to the subdomain maps.google.com -->
<access origin="http://maps.google.com" />

<!-- Access to all the subdomains on google.com -->
<access origin="http://*.google.com" />

<!-- Enable requests to content: URLs -->
<access origin="content:///*" />

<!-- Don't block any requests -->
<access origin="*" />

`<access>`タグがない場合、`file://` URLへのリクエストのみが許可されます。ただし、デフォルトのCordovaアプリケーションには、デフォルトで`<access origin="*">`が含まれています。

注意:許可リストは、許可リストに登録されたリモートWebサイト(つまり、`http`または`https`)から、許可リストに登録されていないWebサイトへのネットワークリダイレクトをブロックできません。CSPをサポートするWebViewでは、CSPルールを使用して、許可リストに登録されていないWebサイトへのリダイレクトを軽減します。

一部のWebサイトでは、ホームページから別のURLに自動的にリダイレクトされる場合があります。例としては、以下のようなシナリオが考えられますが、これらに限定されません。

  • `http`プロトコルリクエストを安全な`https` SSL/TSLプロトコルにリダイレクトする。
  • 国別のドメインにリダイレクトする。例:デバイスの地理に基づいて`https://www.google.com`を`https://www.google.co.uk`にリダイレクトする。

このようなシナリオでは、最初の要件に加えて、許可リストに追加のエントリを修正または追加する必要がある場合があります。アプリの許可リストを構築する際には、これを考慮してください。

特記事項:Androidでは、TalkBackが正しく機能するために必要なため、デフォルトでhttps://ssl.gstatic.com/accessibility/javascript/android/へのリクエストも許可されています。

ナビゲーション許可リスト

これは、WebView自体がナビゲートできるURLを制御します。最上位のナビゲーションにのみ適用されます。

デフォルトでは、ナビゲーションは`file://` URLのみに許可されています。他のURLを許可するには、`config.xml`に`<allow-navigation>`タグを追加する必要があります。

<!-- Allow links to example.com -->
<allow-navigation href="http://example.com/*" />

<!-- Wildcards are allowed for the protocol, as a prefix
     to the host, or as a suffix to the path -->
<allow-navigation href="*://*.example.com/*" />

<!-- 
    A wildcard can be used to allow the entire network, over HTTP and HTTPS.
    This is *NOT RECOMMENDED*
-->
<allow-navigation href="*" />

<!-- The above is equivalent to these three declarations -->
<allow-navigation href="http://*/*" />
<allow-navigation href="https://*/*" />
<allow-navigation href="data:*" />

特記事項:Androidでは、http(s)以外のスキームのiframeにも適用されます。

インテント許可リスト

これは、アプリがシステムに開くように要求できるURLを制御します。

`config.xml`で、次のように`<allow-intent>`タグを追加します

<!-- Allow links to web pages to open in a browser -->
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />

<!-- Allow links to example.com to open in a browser -->
<allow-intent href="http://example.com/*" />

<!-- Wildcards are allowed for the protocol, as a prefix
     to the host, or as a suffix to the path -->
<allow-intent href="*://*.example.com/*" />

<!-- Allow SMS links to open messaging app -->
<allow-intent href="sms:*" />

<!-- Allow tel: links to open the dialer -->
<allow-intent href="tel:*" />

<!-- Allow geo: links to open maps -->
<allow-intent href="geo:*" />

<!-- Allow all unrecognized URLs to open installed apps
     *NOT RECOMMENDED* -->
<allow-intent href="*" />

`<allow-intent>`タグがない場合、外部URLへのリクエストは許可されません。ただし、デフォルトのCordovaアプリケーションには、デフォルトで非常に自由な`allow-intent`エントリのセットが含まれています。各アプリのニーズに基づいてこれを絞り込むことをお勧めします。

Androidでは、これは**BROWSEABLE**タイプのインテントを送信することに相当します。

この許可リストは、メインのCordova WebViewにのみ適用され、InAppBrowser WebViewやシステムWebブラウザでリンクを開くなど、プラグインには適用されません。**ハイパーリンク**と`window.open()`の呼び出しにのみ適用されます。

注意:`allow-navigation`は`allow-intent`よりも優先されます。たとえば、`<allow-navigation href="*" />`を使用してすべてのURLへのナビゲーションを許可すると、すべてのインテントを「キャプチャ」する副作用があり、WebViewが外部アプリをトリガーする代わりにナビゲートします。

コンテンツセキュリティポリシー(CSP)

どのネットワークリクエスト(画像、XHRなど)が(WebViewを介して直接)許可されているかを制御します。

AndroidおよびiOSでは、ネットワークリクエスト許可リスト(上記参照)は、すべてのタイプのリクエストをフィルタリングすることはできません(たとえば、`<video>`およびWebSocketはブロックされません)。したがって、許可リストに加えて、すべてのページにコンテンツセキュリティポリシーの`<meta>`タグを使用する必要があります。

以下に、`.html`ページで使用できるCSP宣言の例を示します。

<!-- Good default declaration:
    * https://ssl.gstatic.com is required only on Android and is needed for TalkBack to function properly
    * Disables use of eval() and inline scripts in order to mitigate risk of XSS vulnerabilities. To change this:
        * Enable inline JS: add 'unsafe-inline' to default-src
        * Enable eval(): add 'unsafe-eval' to default-src
-->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' data: https://ssl.gstatic.com; style-src 'self' 'unsafe-inline'; media-src *">

<!-- Allow everything but only from the same origin and foo.com -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' foo.com">

<!-- This policy allows everything (eg CSS, AJAX, object, frame, media, etc) except that 
    * CSS only from the same origin and inline styles,
    * scripts only from the same origin and inline styles, and eval()
-->
<meta http-equiv="Content-Security-Policy" content="default-src *; style-src 'self' 'unsafe-inline'; script-src 'self' 'unsafe-inline' 'unsafe-eval'">

<!-- Allows XHRs only over HTTPS on the same domain. -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self' https:">

<!-- Allow iframe to https://cordova.dokyumento.jp/ -->
<meta http-equiv="Content-Security-Policy" content="default-src 'self'; frame-src 'self' https://cordova.dokyumento.jp">

その他の注意事項

Application Transport Security(ATS)は、iOS 9(Xcode 7)の新機能です。この新機能は、アプリの許可リストとして機能します。Cordova CLIは、`<access>`タグと`<allow-navigation>`タグを適切なATSディレクティブに自動的に変換します。

`<access>`タグと`<allow-navigation>`タグは、以下に示す3つの属性をサポートしており、ATSに相当する属性があります。

  1. `minimum-tls-version`(文字列、デフォルトは'TLSv1.2')
  2. `requires-forward-secrecy`(ブール値、デフォルトは'true')
  3. `requires-certificate-transparency`(ブール値、デフォルトは'false'、iOS 10の新機能)

<access origin='https://cordova.dokyumento.jp' minimum-tls-version='TLSv1.1' requires-forward-secrecy='false' requires-certificate-transparency='true' />

iOS 10以降では、`<access>`タグは、オリジンのワイルドカード`*`と組み合わせて使用する場合、以下に示す3つの属性もサポートしています。これらの属性には、ATSに相当する属性もあります。

  1. `allows-arbitrary-loads-for-media`(ブール値、デフォルトは'false'、iOS 10の新機能。cordova-ios@4.5.0の新機能で、適切な属性名を使用するように修正されました)。古い属性`allows-arbitrary-loads-in-media`は非推奨になりました。
  2. `allows-arbitrary-loads-in-web-content`(ブール値、デフォルトは'false'、iOS 10の新機能)
  3. `allows-local-networking`(ブール値、デフォルトは'false'、iOS 10の新機能)

<access origin='*' allows-arbitrary-loads-for-media='true' allows-arbitrary-loads-in-web-content='true' allows-local-networking='true' />

詳細については、ATSテクニカルノートを参照してください。