Android アプリでアプリ保護を有効にするには、機能を有効化する前にボット対策 SDK (本トピックでは SDK と呼びます) を統合します。
制限事項
Android API レベル 16 以降が必要です。アプリのターゲット API レベルが 16 未満の場合、SDK は正常に動作しません。
前提条件
開始する前に、以下をご用意ください:
-
アプリ保護 を購入し、有効化していること。「アプリ保護を有効化する手順」をご参照ください。
-
Android 向けの SDK パッケージ (AAR ファイル)。入手するには、DingTalk のサービスグループでテクニカルサポートに連絡するか、チケットを送信してください。ファイル名は
AliTigerTally_X.Y.Z.aarです。X.Y.Zはバージョン番号です。 -
アプリキー (SDK 認証キー)。取得するには、WAF コンソールにログインし、保護設定 > Web サイト保護 を選択します。次に、[Bot Management] タブに移動し、アプリ保護 をオンにして、Appkey の取得およびコピー をクリックします。
Alibaba Cloud アカウントごとに一意のアプリキーが割り当てられます。このアプリキーは、Web Application Firewall (WAF) インスタンス内のすべてのドメイン名、および Android と iOS 両方のアプリで利用できます。アプリキーの例:
****OpKLvM6zliu6KopyHIhmneb_****u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_****vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_****Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK****
仕組み
SDK は、アプリから送信される各リクエストに署名します。WAF はサーバー側でこれらの署名を検証し、悪意のあるトラフィックを検出してブロックした後、正当なリクエストをオリジンサーバーに転送します。
(オプション) テスト用 Android プロジェクトの作成
本番環境のアプリに適用する前に統合手順を試す場合は、まず Android Studio でテストプロジェクトを作成してください。
次の図は、TigerTally_sdk_test という名前のテストプロジェクトの例を示しています。
次の手順に進む前に、テストプロジェクトを実行して動作を確認してください。
SDK の統合
ステップ 1:Android Studio でプロジェクトを開く
Android Studio でプロジェクトを開き、プロジェクトのファイルディレクトリに移動します。
ステップ 2:AAR 依存関係の追加
-
AliTigerTally_X.Y.Z.aarをプロジェクトのlibsディレクトリにコピーします。ファイルをディレクトリに直接ドラッグすることもできます。 -
build.gradleを開き、以下の設定を追加します:-
libsをローカルリポジトリとして宣言します:repositories { flatDir { dirs 'libs' } } -
コンパイル依存関係を追加します:
dependencies { compile(name: 'AliTigerTally_X.Y.Z', ext: 'aar') }重要:
X.Y.Zは、ダウンロードした AAR ファイルの実際のバージョン番号に置き換えてください。
-
-
[Sync Now] をクリックして変更を適用してください。
-
ProGuard を使用してアプリを難読化している場合は、依存関係を追加した直後に次のルールを ProGuard 設定ファイルに追加してください。これにより、SDK のクラスがビルド時に削除されるのを防ぎ、ランタイムエラーを回避できます。
-keep class com.aliyun.TigerTally.* {*;}
ステップ 3:(必要に応じて) ネイティブライブラリフィルターの設定
プロジェクトにすでに SO ファイルが含まれている場合は、この手順をスキップしてください。含まれていない場合は、以下の ndk ブロックを build.gradle に追加してください:
android {
defaultConfig {
ndk {
abiFilters 'arm64-v8a', 'x86', 'armeabi-v7a'
//abiFilters "armeabi-v7a"
}
}
}
ステップ 4:権限の要求
以下の権限を AndroidManifest.xml に追加してください。SDK の動作に必須なのは INTERNET のみです。
| 権限 | 必須 | 実行時リクエスト (Android 6.0+) | 説明 |
|---|---|---|---|
android.permission.INTERNET |
はい | いいえ — インストール時に自動的に付与されます | SDK が署名付きリクエストを WAF に送信できるようにします。 |
android.permission.ACCESS_NETWORK_STATE |
いいえ | いいえ — インストール時に自動的に付与されます | リスクシグナルを強化するためにデバイスのネットワーク状態を読み取ります。 |
android.permission.ACCESS_WIFI_STATE |
いいえ | いいえ — インストール時に自動的に付与されます | リスクシグナルを強化するために Wi-Fi 接続状態を読み取ります。 |
android.permission.READ_PHONE_STATE |
いいえ | はい — 実行時にリクエストする必要があります | リスクシグナルを強化するためにデバイス ID を読み取ります。 |
android.permission.BLUETOOTH |
いいえ | いいえ — インストール時に自動的に付与されます | リスクシグナルを強化するために Bluetooth デバイス情報を読み取ります。 |
android.permission.READ_EXTERNAL_STORAGE |
いいえ | はい — 実行時にリクエストする必要があります | リスクシグナルを強化するために外部ストレージを読み取ります。 |
android.permission.CHANGE_NETWORK_STATE |
いいえ | いいえ — インストール時に自動的に付与されます | リスクシグナルを強化するためにネットワーク接続状態を変更します。 |
ステップ 5:統合コードの追加
5a. (オプション) ユーザー ID の設定
setAccount() を呼び出して、SDK リクエストにユーザー ID を関連付けます。これにより、WAF はユーザーレベルの保護ポリシーを適用できます。ユーザーがログインしていない場合は、この呼び出しをスキップし、代わりに init() を直接呼び出してください。
// Signature: int setAccount(String account)
// Returns: 0 on success, -1 on failure
final String account = "account"; // マスクされたユーザー ID を使用します
TigerTallyAPI.setAccount(account);
| パラメータ | タイプ | 説明 |
|---|---|---|
account |
String |
ユーザー ID です。ユーザーのプライバシーを保護するため、マスクされた値を使用してください。 |
5b. SDK の初期化
アプリの起動時に init() を 1 回だけ呼び出してください。これにより、リスク分析に使用されるデバイス情報が 1 回だけ収集されます。
収集モードは 2 種類あります:
-
DEFAULT: 機密フィールド (imei、imsi、simSerial、wifiMac、wifiList、bluetoothMac) を含むすべてのデバイスデータを収集します。対応する権限が必要です。ユーザーがアプリのプライバシーポリシーに同意した後に、このモードを使用してください。 -
NOT_GRANTED: 機密フィールドをスキップします。ユーザーがプライバシーポリシーに同意する前に、このモードを使用してください。
// Signature: int init(Context context, String appkey, int type)
// Returns: 0 on success, -1 on failure
final String appkey = "your_appkey";
// 完全なデータ収集 (ユーザーがプライバシーポリシーに同意した後)
int ret = TigerTallyAPI.init(this.getApplicationContext(), appkey, TigerTallyAPI.CollectType.DEFAULT);
// 機密フィールドを除外 (ユーザーがプライバシーポリシーに同意する前)
int ret = TigerTallyAPI.init(this.getApplicationContext(), appkey, TigerTallyAPI.CollectType.NOT_GRANTED);
Log.d("AliSDK", "ret:" + ret);
| パラメータ | タイプ | 説明 |
|---|---|---|
context |
Context |
アプリケーションコンテキストです。 |
appkey |
String |
WAF コンソールで取得したアプリキーです。 |
type |
CollectType |
データ収集モード:DEFAULT または NOT_GRANTED。 |
5c. リクエストへの署名
送信する HTTP リクエストごとに、送信前に vmpSign() を呼び出してください。リクエストボディをバイト配列として渡します。GET リクエストまたは POST のボディが空の場合は、null または "".getBytes("UTF-8") を渡します。
// Signature: String vmpSign(int signType, byte[] input)
// Returns: wToken 署名文字列
String request_body = "i am the request body, encrypted or not!";
String wToken = null;
try {
wToken = TigerTallyAPI.vmpSign(1, request_body.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
Log.d("AliSDK", "wToken:" + wToken);
| パラメータ | タイプ | 説明 |
|---|---|---|
signType |
int |
署名アルゴリズムです。デフォルトのアルゴリズムを使用する場合は 1 に設定します。 |
input |
byte[] |
署名対象のリクエストボディです。GET リクエストや、ボディが空の POST リクエストの場合は、null または空のバイト配列を渡します。 |
5d. HTTP ヘッダーへの署名の追加
リクエスト送信前に、wToken の値を HTTP ヘッダーのプロパティとして設定してください。以下の例では HttpURLConnection を使用しています:
String request_body = "i am the request body, encrypted or not!";
new Thread(new Runnable() {
@Override
public void run() {
try {
URL url = new URL("https://www.aliyundoc.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5000);
conn.setRequestMethod("POST");
// wToken 署名をリクエストヘッダーに追加
conn.setRequestProperty("wToken", wToken);
OutputStream os = conn.getOutputStream();
// リクエストボディを書き込む
byte[] requestBody = request_body.getBytes("UTF-8");
os.write(requestBody);
os.flush();
os.close();
int code = conn.getResponseCode();
Log.d("respCode", Integer.toString(code));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
統合後の動作
統合が完了すると、アプリから送信される各リクエストに対して、以下の処理が行われます:
-
vmpSign()がリクエストボディからwToken署名を生成します。 -
wTokenを HTTP ヘッダーとして付与します。 -
WAF が
wTokenヘッダーを検査し、署名検証に失敗したリクエストをブロックし、有効なリクエストをオリジンサーバーに転送します。