monaca

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