SafetyNet Safe Browsing API

SafetyNet Safe Browsing API は Google Play 開発者サービスによるライブラリで、URL が Google によって既知の脅威としてマークされているかどうかを判断するサービスを提供します。

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

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

利用規約

Safe Browsing API を使用すると、利用規約に従うことに同意したものと見なされます。適用されるすべての利用規約とポリシーを読んで理解したうえで、Safe Browsing API にアクセスしてください。

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

Safe Browsing API を使用する前に、Android API キーを作成して登録します。具体的な手順については、セーフ ブラウジングのスタートガイドをご覧ください。

SafetyNet API の依存関係を追加する

Safe Browsing API を使用する前に、SafetyNet API をプロジェクトに追加します。Android Studio を使用している場合は、アプリレベルの Gradle ファイルにこの依存関係を追加します。詳細については、SafetyNet によるセキュリティ上の脅威からの保護をご覧ください。

API を初期化する

Safe Browsing API を使用するには、API を初期化するために initSafeBrowsing() を呼び出して完了するまで待つ必要があります。次のコード スニペットに例を示します。

Kotlin

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

Java

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

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

アプリで URL チェックを使用すると、URL が既知の脅威を引き起こすかどうかを判定できます。脅威の中には、開発するアプリにとって重要でない種類の脅威もあります。この 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";

どちらも有効です。

次のコードは、URL チェック リクエストを送信する方法を示しています。

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 が検出した既知の脅威を特定します。

推奨される警告の文言については、Safe Browsing API のデベロッパー ガイドをご覧ください。

脅威の種類を指定する

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

脅威の種類 定義
TYPE_POTENTIALLY_HARMFUL_APPLICATION この脅威の種類では、有害な可能性があるアプリが含まれているとフラグが付いたページの URL を検出します。
TYPE_SOCIAL_ENGINEERING この脅威の種類では、ソーシャル エンジニアリングの脅威が含まれているとフラグが付いたページの URL を検出します。

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

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

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

Kotlin

SafetyNet.getClient(this).shutdownSafeBrowsing()

Java

SafetyNet.getClient(this).shutdownSafeBrowsing();

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

SafetyNet Safe Browsing API によって収集されるデータ

SafetyNet Safe Browsing API は、Android のセーフ ブラウジング サービスと通信する際に、次のデータを自動的に収集します。

データ 説明
アプリのアクティビティ 不正な URL を検出する目的で、ローカル ハッシュ接頭辞が一致した後に、URL のハッシュ接頭辞を収集します。

Google はできる限り透明性を確保することを心掛けていますが、アプリによるデータの収集および共有とアプリのセキュリティ対策に関して Google Play のデータ セーフティ セクションのフォームにどのように入力するかを決定する責任は、デベロッパーのみにあります。