[Monaca] Whitelistプラグインについて

Monacaで開発するアプリでは、アプリからアクセスできる外部サイトを制限するために、Whitelistプラグインが導入されています。

Whitelistプラグインは、Cordova 5.2からMonacaアプリに自動で組み込まれています。
Whitelistプラグインは、削除することはできません。

検証の際の注意点として、Monacaデバッガーと実機では、コンテンツのセキュリティーが異なるため、最終的には実機で確認する必要があります。

また、Whitelistプラグインは、Android用のプラグインになりますが、Whitelistプラグインで使用する設定（`access ` `allow-navigation`）を行うことにより、iOSのApplication Transport Security（ATS）を制御することができます。（後述）


#Whitelistプラグインの機能

| 機能  | 用途 |
|:--------|:------------|
| access | JavaScript からネイティブ側へWebView経由で送信されるコンテンツ（ネットワーク）のリクエスト。  |
| allow-navigation | ページの遷移。 |
| allow-intent   | 外部アプリの呼び出し。 |
| Content Security Policy（CSP） | JavaScript からネイティブ側へWebView経由で送信されるコンテンツ（ネットワーク）のリクエスト。（フィルター設定が可能） |

Whitelistプラグインの設定は、`config.xml`に設定されています。
現在のMonacaの仕様では、`access`設定は、アプリ設定の`許可する外部URL`から行うことができますが、`allow-navigation` `allow-intent`は、直接`config.xml`を修正する必要があります。


#access

JavaScriptからネイティブ側へのブリッジ越しに送信されるコンテンツ（ネットワーク）のリクエスト（画像、XHR など）に対してリクエストの許可を制御することができます。

パラメーターは、`origin`になります。
デフォルト、は、`*`です 。すべてのアドレスを許可します。

例：

```xml:config.xml
<access origin="https://ja.monaca.io" />
```


#allow-navigation

WebView上で使用できるURLを制御することができます。
最上位からのページ遷移、および、http（s）スキーマを使用していない`iframe`に適用されます。

パラメーターは、`href `になります。
デフォルトは、`*`です 。（すべてのアドレスを許可します。）

例：

```xml:config.xml
<allow-navigation href="https://ja.monaca.io/*" />
```


#allow-intent

アプリ側から外部アプリの呼び出しを制御することができます。
アプリ側からシステム側に対して、外部アプリを開くようにリクエストする場合、対象のURL登録します。

パラメーターは、`href `になります。
デフォルトは、 `""`（外部アプリの呼び出しは、できません。）

例：

```xml:config.xml
<!-- tel:に対応した外部アプリの設定 -->
<allow-intent href="tel:*" />
```


#Content Security Policy（CSP）

`access`と同様の制御を行うことができますが、`Content Security Policy（CSP）`では、リクエストの種類に応じたフィルターを設定することができます。

例：
Monacaでは、標準設定として下記が設定されています。

```html:index.html
<meta http-equiv="Content-Security-Policy" content="default-src * data:; style-src * 'unsafe-inline'; script-src * 'unsafe-inline' 'unsafe-eval'">
```


#Application Transport Security（ATS）

iOS9以降では、Application Transport Security（ATS）が適用されます。
Whitelistプラグインは、Android用のプラグインになりますが、config.xmlの`access ` `allow-navigation`を設定することにより、ATSの制御を行うことができます。

config.xmlの設定とinfo.plistヘの反映内容は、下記になります。

設定例1

```xml:config.xml
<access origin="*"/>
<allow-navigation href="*"/>
```

```info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>NSAllowsArbitraryLoads</key>
	<true/>
</dict>
</plist>
```

設定例2

```xml:config.xml
<access origin='http://cordova.apache.org' minimum-tls-version='TLSv1.1' requires-forward-secrecy='false' requires-certificate-transparency='true' />
<allow-navigation href="*"/>
```

```info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>NSAllowsArbitraryLoads</key>
	<true/>
	<key>NSExceptionDomains</key>
	<dict>
		<key>cordova.apache.org</key>
		<dict>
			<key>NSExceptionMinimumTLSVersion</key>
			<string>TLSv1.1</string>
			<key>NSExceptionAllowsInsecureHTTPLoads</key>
			<true/>
			<key>NSExceptionRequiresForwardSecrecy</key>
			<false/>
		</dict>
	</dict>
</dict>
</plist>
```

設定例3

```xml:config.xml
<access origin="*"/>
<allow-navigation href="http://cordova.apache.org" minimum-tls-version="TLSv1.1" requires-forward-secrecy="false" requires-certificate-transparency="true"/>
```

```info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>NSAllowsArbitraryLoads</key>
	<true/>
	<key>NSExceptionDomains</key>
	<dict>
		<key>cordova.apache.org</key>
		<dict>
			<key>NSExceptionMinimumTLSVersion</key>
			<string>TLSv1.1</string>
			<key>NSExceptionAllowsInsecureHTTPLoads</key>
			<true/>
			<key>NSExceptionRequiresForwardSecrecy</key>
			<false/>
		</dict>
	</dict>
</dict>
</plist>
```

設定例4

```xml:config.xml
<access origin='http://cordova.apache.org' minimum-tls-version='TLSv1.1' requires-forward-secrecy='false' requires-certificate-transparency='true' />
<allow-navigation href='http://cordova.apache.org' minimum-tls-version='TLSv1.1' requires-forward-secrecy='false' requires-certificate-transparency='true' />
```

```info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>NSExceptionDomains</key>
	<dict>
		<key>cordova.apache.org</key>
		<dict>
			<key>NSExceptionMinimumTLSVersion</key>
			<string>TLSv1.1</string>
			<key>NSExceptionAllowsInsecureHTTPLoads</key>
			<true/>
			<key>NSExceptionRequiresForwardSecrecy</key>
			<false/>
		</dict>
	</dict>
</dict>
</plist>
```

設定例5

`NSAllowsArbitraryLoads`の値が`false`の場合は、
access
allow-navigation
の値は、無視されます。

```xml:config.xml
<platform name="ios">
  <config-file platform="ios" target="*-Info.plist" parent="NSAppTransportSecurity">
    <dict>
      <key>NSAllowsArbitraryLoads</key>
      <false/>
    </dict>
  </config-file>
</platform>
```

```info.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>NSAllowsArbitraryLoads</key>
	<false/>
</dict>
</plist>
```


#さいごに
Whitelistプラグインの詳しい情報については、[ホワイトリストへの登録 プラグイン ( Android 専用 )](https://docs.monaca.io/ja/reference/cordova_5.2/whitelist/)を参照ください。