SafetyNet Safe Browsing API

SafetyNet のサービスを利用すると、URL が Google によって既知の脅威としてマークされているかどうかを判定できます。

アプリでこの API を使用すると、特定の URL が Google によって既知の脅威に分類されているかどうかを判定できます。内部的には、SafetyNet は、Google が開発したセーフ ブラウジング ネットワーク プロトコル v4 のクライアントを実装しています。クライアント コードと v4 ネットワーク プロトコルは、ユーザーのプライバシーを保護し、電池と帯域幅の消費を最小限に抑えるように設計されています。この API を使用すると、リソースに最適化しながら、Android で Google のセーフ ブラウジング サービスを最大限に活用でき、このサービスのネットワーク プロトコルを実装する必要がなくなります。

このドキュメントでは、SafetyNet を使用して URL に既知の脅威があるかどうかをチェックする方法について説明します。

利用規約

セーフ ブラウジング API を使用すると、お客様は利用規約に従うことに同意したと見なされます。 セーフ ブラウジング API にアクセスする前に、適用されるすべての利用規約とポリシーを確認してください。

Android API キーをリクエストして登録する

API キーを作成する手順は次のとおりです。

  1. Google Developers Console にアクセスします。
  2. 上部のツールバーで、[プロジェクトの選択] > プロジェクト名の順に選択します。
  3. 検索ボックスに「Safe Browsing API」と入力します。表形式の一覧に Safe Browsing API の名前が表示されたら選択します。
  4. ページが再表示されたら、[有効にする] を選択してから、[認証情報に進む] を選択します。
  5. [プロジェクトへの認証情報の追加] ウィンドウが表示されたら、パラメータを選択してから、[必要な認証情報報] を選択します。
  6. API キーの名前を入力してから、[API キーを作成する] を選択します。
  7. 新しい API キーが表示されます。後で使用するために、このキーをコピーして保存します。

    注: 作成した API キーを使用すると、1 日あたり 10,000 回 URL をチェックできます。この場合、キーは URL の一部ではなく、16 進文字列である必要があります。

  8. [完了] を選択して、この手順を終了します。

詳細については、Google Developers Console のヘルプセンターをご覧ください。

API を初期化する

セーフ ブラウジング API を使用するには、initSafeBrowsing() を呼び出してから完了するまで待つことにより、API を初期化する必要があります。次のコード スニペットに例を示します。

Kotlin

    Tasks.await(SafetyNet.getClient(this).initSafeBrowsing())
    

Java

    Tasks.await(SafetyNet.getClient(this).initSafeBrowsing());
    

注: アプリの初期化の影響を最小限に抑えるために、アクティビティの onResume() メソッドの中で、できるだけ早く initSafeBrowsing() を呼び出してください。

URL チェックをリクエストする

アプリで URL チェックを使用すると、URL が既知の脅威を引き起こすかどうかを判定できます。 脅威の中には、開発するアプリにとって重要でない種類の脅威もあります。この API を使用すると、ニーズに合った脅威の種類を選択できます。既知の脅威の種類は複数指定できます。

脅威の種類を指定する

SafeBrowsingThreat クラスの定数に、現在サポートされている脅威の種類が含まれています。

    package com.google.android.gms.safetynet;

    public class SafeBrowsingThreat {

      /**
       * This threat type identifies URLs of pages that are flagged as containing potentially
       * harmful applications.
       */
      public static final int TYPE_POTENTIALLY_HARMFUL_APPLICATION = 4;

      /**
       * This threat type identifies URLs of pages that are flagged as containing social
       * engineering threats.
       */
      public static final int TYPE_SOCIAL_ENGINEERING = 5;
    }
    

この API を使用する場合は、必ず非推奨とマークされていない定数を使用します。 API には、脅威の種類を表す定数を引数として追加します。脅威の種類を表す定数は、アプリが必要とするだけ追加できます。

URL チェック リクエストを送信する

この API はスキームに依存しないため、スキームがある URL も、スキームがない URL も渡すことができます。次に例を示します。

Kotlin

    var url = "https://www.google.com"
    

Java

    String url = "https://www.google.com";
    

および

Kotlin

    var url = "www.google.com"
    

Java

    String url = "www.google.com";
    

以上が有効です。

Kotlin

    SafetyNet.getClient(this).lookupUri(
            url,
            SAFE_BROWSING_API_KEY,
            SafeBrowsingThreat.TYPE_POTENTIALLY_HARMFUL_APPLICATION,
            SafeBrowsingThreat.TYPE_SOCIAL_ENGINEERING
    )
            .addOnSuccessListener(this) { sbResponse ->
                // Indicates communication with the service was successful.
                // Identify any detected threats.
                if (sbResponse.detectedThreats.isEmpty()) {
                    // No threats found.
                } else {
                    // Threats found!
                }
            }
            .addOnFailureListener(this) { e: Exception ->
                if (e is ApiException) {
                    // An error with the Google Play Services API contains some
                    // additional details.
                    Log.d(TAG, "Error: ${CommonStatusCodes.getStatusCodeString(e.statusCode)}")

                    // Note: If the status code, s.statusCode,
                    // is SafetyNetstatusCode.SAFE_BROWSING_API_NOT_INITIALIZED,
                    // you need to call initSafeBrowsing(). It means either you
                    // haven't called initSafeBrowsing() before or that it needs
                    // to be called again due to an internal error.
                } else {
                    // A different, unknown type of error occurred.
                    Log.d(TAG, "Error: ${e.message}")
                }
            }
    

Java

    SafetyNet.getClient(this).lookupUri(url,
              SAFE_BROWSING_API_KEY,
              SafeBrowsingThreat.TYPE_POTENTIALLY_HARMFUL_APPLICATION,
              SafeBrowsingThreat.TYPE_SOCIAL_ENGINEERING)
        .addOnSuccessListener(this,
            new OnSuccessListener<SafetyNetApi.SafeBrowsingResponse>() {
                @Override
                public void onSuccess(SafetyNetApi.SafeBrowsingResponse sbResponse) {
                    // Indicates communication with the service was successful.
                    // Identify any detected threats.
                    if (sbResponse.getDetectedThreats().isEmpty()) {
                        // No threats found.
                    } else {
                        // Threats found!
                    }
             }
        })
        .addOnFailureListener(this, new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    // An error occurred while communicating with the service.
                    if (e instanceof ApiException) {
                        // An error with the Google Play Services API contains some
                        // additional details.
                        ApiException apiException = (ApiException) e;
                        Log.d(TAG, "Error: " + CommonStatusCodes
                            .getStatusCodeString(apiException.getStatusCode()));

                        // Note: If the status code, apiException.getStatusCode(),
                        // is SafetyNetstatusCode.SAFE_BROWSING_API_NOT_INITIALIZED,
                        // you need to call initSafeBrowsing(). It means either you
                        // haven't called initSafeBrowsing() before or that it needs
                        // to be called again due to an internal error.
                    } else {
                        // A different, unknown type of error occurred.
                        Log.d(TAG, "Error: " + e.getMessage());
                    }
                }
        });
    

URL チェック レスポンスを確認する

返された SafetyNetApi.SafeBrowsingResponse オブジェクトを使用して、その getDetectedThreats() メソッドを呼び出すと、SafeBrowsingThreat オブジェクトのリストが返されます。返されたリストが空の場合、この API は既知の脅威を検出していません。返されたリストが空でない場合、リストの各要素で getThreatType() を呼び出すと、API が検出した既知の脅威がわかります。

セーフ ブラウジング セッションをシャットダウンする

アプリがセーフ ブラウジング API を長時間使用しない場合は、アプリ内の必要な URL をすべてチェックしてから、shutdownSafeBrowsing() メソッドを使用してセーフ ブラウジング セッションをシャットダウンします。

Kotlin

    SafetyNet.getClient(this).shutdownSafeBrowsing()
    

Java

    SafetyNet.getClient(this).shutdownSafeBrowsing();
    

アクティビティの onPause() メソッドで shutdownSafeBrowsing() を呼び出し、onResume() メソッドで initSafeBrowsing() を呼び出すことをおすすめします。ただし、必ず initSafeBrowsing() の終了を確認してから、lookupUri() を呼び出してください。セッションが常に最新の状態になるため、アプリの内部エラーを減らすことができます。

推奨される警告の文言

推奨される警告の文言については、セーフ ブラウジング API 開発者向けガイドをご覧ください。