すべてのプロダクト
Search
ドキュメントセンター

Web Application Firewall:Anti-Bot SDKをAndroidアプリに統合する

最終更新日:Jun 03, 2024

このトピックでは、Anti-Bot SDKをAndroidアプリに統合する方法について説明します。 このトピックでは、Anti-Bot SDKをSDKと呼びます。 Androidアプリのアプリ保護機能を有効にする前に、SDKをAndroidアプリに統合する必要があります。

制限事項

AndroidアプリはAndroid 16以降を使用する必要があります。 APIのバージョンが16より前の場合、SDKは期待どおりに機能しません。

前提条件

  • アプリ保護機能が購入され、有効になります。

    詳細については、「アプリ保護を有効にする手順」をご参照ください。

  • Androidアプリ用のSDKが取得されました。

    アプリ保護機能を購入した後、DingTalkサービスグループのテクニカルサポートに連絡してSDKを入手できます。 を送信することもできます。[新しいチケットページ] を使用してSDKを取得します。

    Androidアプリ用SDKには、AliTigerTally_X.Y.Z. AARという形式のaarファイルが含まれています。 X.Y.Zはファイルのバージョン番号を示します。

  • SDK認証キー、すなわちアプリキーを取得する。
    アプリキーを取得するには、Web Application Firewallコンソールにログインし、[保護設定] > [Webサイト保護] を選択します。 [Webサイト保護] ページの [ボット管理] タブで、[アプリ保護] をオンにし、[Appkeyの取得とコピー] をクリックします。 SDK認証キーは、SDK初期化要求の送信に使用されます。 キーは統合コードに含まれている必要があります。
    説明 各Alibaba Cloudアカウントには一意のアプリキーがあり、WAFインスタンスのすべてのドメイン名に使用できます。 SDKをAndroidアプリに統合するかiOSアプリに統合するかに関係なく、アプリキーを使用できます。
    App Protection
    認証キーの例:
    **** OpKLvM6zliu6KopyHIhmneb_**** u4ekci2W8i6F9vrgpEezqAzEzj2ANrVUhvAXMwYzgY_**** vc51aEQlRovkRoUhRlVsf4IzO9dZp6nN_**** Wz8pk2TDLuMo4pVIQvGaxH3vrsnSQiK ****

背景情報

SDKは、アプリによって送信されるリクエストに署名するために使用されます。 Web Application Firewall (WAF) は、リクエストのシグネチャを検証して、アプリサービスのリスクを特定し、悪意のあるリクエストをブロックします。

(オプション) テストAndroidプロジェクトを作成する

SDKを実際のAndroidプロジェクトに統合できます。 SDKをテストAndroidプロジェクトに統合して、SDKを実際のAndroidプロジェクトに統合する前に、統合操作に慣れることもできます。

この例では、Android Studioを使用してテストAndroidプロジェクトを作成します。

次の図は、TigerTally_sdk_testという名前のテストプロジェクトを示しています。 Test projectSDKをアプリに統合する前に、テストプロジェクトが期待どおりに実行されることを確認してください。 Check whether the test project is running

手順

  1. Android Studioを使用してテストプロジェクトを開き、ファイルディレクトリを入力します。
  2. AARファイルを参照します。
    1. AliTigerTally.aarファイルをlibsディレクトリにコピーします。 ファイルをディレクトリにドラッグすることもできます。 Copy the file to the libs directory
    2. build.gradleファイルを開き、次の説明に基づいて設定を変更します。
      • libsディレクトリを依存関係のソースとして追加します。
        リポジトリ {
           flatDir {
             dirs 'libs'
           }
        }
      • コンパイル依存関係を追加します。
        重要 次のコードのバージョン番号 (X.Y.Z) を、取得したAARファイルのバージョン番号に置き換える必要があります。
        依存関係 {
          コンパイル (名前: 'AliTigerTally_X.Y.Z '、ext: 'aar')
        } 
    3. [今すぐ同期] をクリックして、プロジェクトへの変更を同期します。
  3. SOファイルを参照します。
    SOファイルがプロジェクトに含まれている場合は、この手順をスキップします。 それ以外の場合は、次の設定をbuild.gradleファイルに追加します:
    android {
        defaultConfig {
        ndk {
            abiFilters 'arm64-v8a' 、'x86' 、"armeabi-v7a"
            // abiFilters "armeabi-v7a"
          }
        }
    }
  4. アプリに対して次の権限を申請します。
    権限必須説明
    android.permission.INTERNETインターネットに接続します。
    android.permission.ACCESS_NETWORK_STATE任意デバイスのネットワークステータスを取得します。
    android.permission.ACCESS_WIFI_STATE任意デバイスのWi-Fi接続ステータスを取得します。
    android.permission.READ_PHONE_STATE任意デバイスのステータスとIDを読み取ります。
    重要 Android 6.0以降のアプリでは、この権限を動的に申請する必要があります。
    android.permission.BLUETOOTH任意デバイスのBluetooth権限を取得します。
    android.permission. READ_EXTERNAL_STORAGE任意デバイスの外部ストレージを読み取ります。
    重要 Android 6.0以降のアプリでは、この権限を動的に申請する必要があります。
    android.permission.CHANGE_NETWORK_STATE任意デバイスのネットワークステータスを変更します。
  5. 統合コードを追加します。
    1. ユーザーIDを指定します。
      関数:
      int setAccount (文字列アカウント);

      説明: リクエストにユーザーIDを指定します。 これにより、WAF保護ポリシーをより効率的に構成できます。

      パラメーター: <account> 。ユーザーIDを指定します。 データ型: 文字列。 マスクされたユーザーIDを入力することを推奨します。

      戻り値: 設定が成功したかどうかを示す値。 データ型: int。 値0は、設定が成功したことを示します。 値 -1は、設定が失敗したことを示します。

      サンプルコード:
      最後のString account="account";
      TigerTallyAPI.setAccount(account); // ログオンユーザーがゲストの場合、この関数を呼び出す必要はありません。 初期化関数を直接呼び出すことができます。 
    2. SDKを初期化します。
      関数:
      int init (コンテキスト、文字列appkey、int型);

      説明: SDKを初期化し、1回限りの情報収集を実行します。 1回の情報収集では、端末情報を1回収集できます。 端末情報を再度収集する場合は、init関数を呼び出します。

      1回限りの情報収集は、完全なデータ収集と機密フィールドを除くデータ収集の2つのモードをサポートします。 機密フィールドには、ユーザーのimei、imsi、simSerial、wifiMac、wifiList、およびbluetoothMacが含まれます。 機密フィールドを収集するには、権限を取得する必要があります。
      説明 ユーザーがアプリのプライバシーポリシーに同意する前に、2番目のモードを使用することをお勧めします。 ユーザーがアプリのプライバシーポリシーに同意した後、最初のモードを使用することをお勧めします。 完全なデータ収集は、リスクの特定に役立ちます。
      パラメーター:
      • <context>: アプリに渡されるコンテキストを指定します。
      • <appkey>: SDK認証キーを指定します。 データ型: 文字列。
      • <type>: 収集モードを指定します。 データ型: CollectType。 有効な値:
        • DEFAULT: 完全なデータ収集。
        • NO_GRANTED: 機密フィールドを除くデータの収集。

        戻り値: 初期化が成功したかどうかを示す値。 データ型: int。 値0は、初期化が成功したことを示す。 値 -1は、初期化が失敗したことを示します。

      サンプルコード:
      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); 
    3. Signリクエストデータ。
      関数:
      String vmpSign(int signType, byte[] input);

      説明: 入力データに署名し、署名文字列を返します。

      パラメーター:
      • <signType>: 署名アルゴリズムを指定します。 データ型: int。 値を1に設定します。これは、デフォルトの署名アルゴリズムが使用されていることを示します。
      • <input>: 署名するデータを指定します。 データ型: byte[] 。

        ほとんどの場合、署名されるデータはリクエストの本文全体です。 POSTリクエストボディが空の場合、またはGETリクエストボディが使用されている場合は、nullを入力するか、空の文字列から変換されたbyte[] 配列を入力します。 例: "".getBytes("UTF-8")

      戻り値: 署名文字列。 データ型: 文字列。

      サンプルコード:
      説明 次のサンプルコードでは、署名文字列はwTokenとして定義されています。
      String request_body = "i am the request body, encrypted or not!";
      文字列wToken = null;
      try {
          wToken = TigerTallyAPI.vmpSign(1, request_body.getBytes("UTF-8"));
      } catch (UnsupportedEncodingException e) {
          e.printStackTrace();
      }
      Log.d("AliSDK", "wToken:" + wToken); 
    4. HTTPヘッダーに署名文字列を追加します。
      たとえば、プロジェクトでHttpURLConnectionクラスを使用している場合、署名文字列wTokenの内容をHttpURLConnectionクラスのオブジェクトに追加できます。
      サンプルコード:
      request_body = "i am the request body, encrypted or not!";
      new Thread(new Runnable() {
          @Override
          public void run() {
              try {
                  URL url=新しいURL (「 https://www.aliyundoc.com 」);
                  HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                  conn.setReadTimeout(5000);
                  conn.setRequestMethod("POST");
                  // set wToken info to header
                  conn.setRequestProperty("wToken", wToken);
                  OutputStream os = conn.getOutputStream();
                  // set request body info
                  byte[] requestBody = request_body.getBytes("UTF-8");
                  os.write(requestBody);
                  os.flush();
                  os.close();
                  int code = conn.getResponseCode();
                  Log.d("respCode", Integer.toString (コード));
              } catch (MalformedURLException e) {
                  e.printStackTrace();
              } catch (UnsupportedEncodingException e) {
                  e.printStackTrace();
              } catch (ProtocolException e) {
                  e.printStackTrace();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          };
          }).start(); 
    5. 新しいHTTPヘッダーを使用するリクエストをアプリのサーバーに送信します。
      WAFは、サーバー宛てのリクエストを受信し、署名文字列wTokenを解析して悪意のあるリクエストを識別してブロックし、通常のリクエストをサーバーに転送します。

難読化コード

ProGuardを使用してコードを難読化する場合、-keepを使用してSDKの機能を設定できます。 これにより、SDKの機能が削除されるのを防ぐことができます。

サンプルコード:
-keep class com.aliyun.TigerTally.* {*;}