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
になります。
デフォルト、は、*
です 。すべてのアドレスを許可します。
例:
<access origin="https://ja.monaca.io" />
#allow-navigation
WebView上で使用できるURLを制御することができます。
最上位からのページ遷移、および、http(s)スキーマを使用していないiframe
に適用されます。
パラメーターは、href
になります。
デフォルトは、*
です 。(すべてのアドレスを許可します。)
例:
<allow-navigation href="https://ja.monaca.io/*" />
#allow-intent
アプリ側から外部アプリの呼び出しを制御することができます。
アプリ側からシステム側に対して、外部アプリを開くようにリクエストする場合、対象のURL登録します。
パラメーターは、href
になります。
デフォルトは、 ""
(外部アプリの呼び出しは、できません。)
例:
<!-- tel:に対応した外部アプリの設定 -->
<allow-intent href="tel:*" />
#Content Security Policy(CSP)
access
と同様の制御を行うことができますが、Content Security Policy(CSP)
では、リクエストの種類に応じたフィルターを設定することができます。
例:
Monacaでは、標準設定として下記が設定されています。
<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
<access origin="*"/>
<allow-navigation href="*"/>
<?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
<access origin='http://cordova.apache.org' minimum-tls-version='TLSv1.1' requires-forward-secrecy='false' requires-certificate-transparency='true' />
<allow-navigation href="*"/>
<?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
<access origin="*"/>
<allow-navigation href="http://cordova.apache.org" minimum-tls-version="TLSv1.1" requires-forward-secrecy="false" requires-certificate-transparency="true"/>
<?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
<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' />
<?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
の値は、無視されます。
<platform name="ios">
<config-file platform="ios" target="*-Info.plist" parent="NSAppTransportSecurity">
<dict>
<key>NSAllowsArbitraryLoads</key>
<false/>
</dict>
</config-file>
</platform>
<?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 専用 )を参照ください。