Edited at

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

More than 1 year has passed since last update.

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になります。

デフォルト、は、*です 。すべてのアドレスを許可します。

例:


config.xml

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



allow-navigation

WebView上で使用できるURLを制御することができます。

最上位からのページ遷移、および、http(s)スキーマを使用していないiframeに適用されます。

パラメーターは、hrefになります。

デフォルトは、*です 。(すべてのアドレスを許可します。)

例:


config.xml

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



allow-intent

アプリ側から外部アプリの呼び出しを制御することができます。

アプリ側からシステム側に対して、外部アプリを開くようにリクエストする場合、対象のURL登録します。

パラメーターは、hrefになります。

デフォルトは、 ""(外部アプリの呼び出しは、できません。)

例:


config.xml

<!-- tel:に対応した外部アプリの設定 -->

<allow-intent href="tel:*" />


Content Security Policy(CSP)

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

例:

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


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


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


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


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


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

の値は、無視されます。


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 専用 )を参照ください。