安卓應用安全指南4.7使用可瀏覽的意圖

apachecn_飛龍發表於2018-03-24

4.7 使用可瀏覽的意圖

原書:Android Application Secure Design/Secure Coding Guidebook

譯者:飛龍

協議:CC BY-NC-SA 4.0

Android 應用可以設計為從瀏覽器啟動,並對應網頁連結。 這個功能被稱為“可瀏覽的意圖”。 通過在清單檔案中指定 URI 模式,應用將響應具有其 URI 模式的連結轉移(使用者點選等),並且應用以連結作為引數啟動。

此外,使用 URI 模式從瀏覽器啟動相應應用的方法不僅支援 Android,也支援 iOS 和其他平臺,這通常用於 Web 應用與外部應用之間的連結等。例如, 在 Twitter 應用或 Facebook 應用中定義了以下 URI 模式,並且在 Android 和 iOS 中從瀏覽器啟動相應的應用。

表 4.7-1

URL 模式 相應應用
fb:// Facebook
twitter:// Twitter

考慮到聯動性和便利性,功能似乎非常方便,但存在一些風險,即該功能被惡意第三方濫用。 可以假設的是,它們濫用應用功能,通過準備一個惡意網站,它的連結的 URL 具有不正確的引數,或者它們通過欺騙智慧手機使用者安裝惡意軟體,它包含相同的 URI 模式,來獲取包含在 URL 中的資訊。 使用“可瀏覽的意圖”來對付這些風險時有一些要注意的地方。

4.7.1 示例程式碼

使用“可瀏覽的意圖”的應用的示例程式碼如下:

要點:

1) (網頁側)不得包含敏感資訊。

2) 仔細和安全地處理 URL 引數。

Starter.html

<html>
    <body>
        <!-- *** POINT 1 *** Sensitive information must not be included -->
        <!-- Character strings to be passed as URL parameter, should be UTF-8 and URI encoded. -->
        <a href="secure://jssec?user=user_id"> Login </a>
    </body>
</html>

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:allowBackup="false" >
        <activity
            android:name=".BrowsableIntentActivity"
            android:label="@string/title_activity_browsable_intent"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                // Accept implicit Intent
                <category android:name="android.intent.category.DEFAULT" />
                // Accept Browsable intent
                <category android:name="android.intent.category.BROWSABLE" />
                // Accept URI `secure://jssec`
                <data android:scheme="secure" android:host="jssec"/>
            </intent-filter>
        </activity>
    </application>
</manifest>

BrowsableIntentActivity.java

package org.jssec.android.browsableintent;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.widget.TextView;

public class BrowsableIntentActivity extends Activity {

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_browsable_intent);
        Intent intent = getIntent();
        Uri uri = intent.getData();
        if (uri != null) {
            // Get UserID which is passed by URI parameter
            // *** POINT 2 *** Handle the URL parameter carefully and securely.
            // Omitted, since this is a sample. Please refer to "3.2 Handling Input Data Carefully and Securely."
            String userID = "User ID = " + uri.getQueryParameter("user");
            TextView tv = (TextView)findViewById(R.id.text_userid);
            tv.setText(userID);
        }
    }
}

4.7.2 規則書

使用“可瀏覽的意圖”時,需要遵循以下規則:

4.7.2.1 (網頁端)敏感資訊不得包含在相應連結的引數中(必需)

當點選瀏覽器中的連結時,會發出一個意圖,該意圖的資料中有 URL 值(可以通過Intent#getData獲取),並且帶有相應意圖過濾器的應用,從 Android 系統啟動。

此時,當幾個應用設定意圖過濾器來接收相同的 URI 模式時,應用選擇對話方塊將顯示,與隱式意圖正常啟動相同,並啟動使用者選擇的應用。 如果應用選擇對話方塊中列出了惡意軟體,則使用者可能會錯誤地啟動惡意軟體,並將 URL 中的引數傳送到惡意軟體。

如上所述,需要避免直接在 URL 引數中包含敏感資訊,因為它用於建立一般網頁連結,所有包含在網頁連結 URL 中的引數都可以提供給惡意軟體。

使用者 ID 和密碼包含在 URL 中的例子:

insecure://sample/login?userID=12345&password=abcdef

此外,即使 URL 引數僅包含非敏感內容,如使用者ID,在由’可瀏覽的意圖’啟動後,在應用中輸入密碼時,使用者可能會啟動惡意軟體並向其輸入密碼。所以應該考慮,一些規範,例如整個登入過程,在應用端完成。 在設計應用時必須記住它,並且由’可瀏覽的意圖’啟動應用,等同於由隱式意圖啟動,並且不保證啟動了有效的應用。

4.7.2.2 小心和安全地處理 URL 引數(必需)

傳送給應用的 URL 引數,並不總是來自合法的 Web 頁面,因為匹配 URI 模式連結不僅可以由開發者生成,也可以由任何人生成。 另外,沒有方法可以驗證 URL 引數是否從有效網頁傳送。

因此,在使用 URL 引數之前,有必要驗證 URL 引數的安全性,例如,檢查是否包含意外值。


相關文章