LoginSignup
13
5

More than 5 years have passed since last update.

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

Last updated at Posted at 2017-03-17

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

13
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
5