注: このドキュメントは現在開発中です。近い将来、改善される予定です。
Google セーフ ブラウジング v5 は、Google セーフ ブラウジング v4 の進化版です。v5 で行われた 2 つの主な変更は、データの更新頻度と IP プライバシーです。また、API サーフェスが改善され、柔軟性と効率性が向上し、肥大化が軽減されました。さらに、Google セーフ ブラウジング v5 は、v4 からの移行を容易にするように設計されています。
現在、Google は v4 と v5 の両方を提供しており、どちらも本番環境に対応していると見なされています。v4 または v5 を使用できます。v4 のサポート終了日はまだ発表されていません。発表された場合は、少なくとも 1 年前にお知らせします。このページでは、v5 と v4 から v5 への移行ガイドについて説明します。v4 のドキュメントはすべて利用可能です。
データの更新頻度
v5 では、リアルタイム保護と呼ばれる動作モードが導入されています。これにより、上記のデータの古さの問題を回避できます。v4 では、クライアントはローカル データベースをダウンロードして維持し、ローカルにダウンロードした脅威リストに対してチェックを実行し、プレフィックスの部分一致がある場合は、完全なハッシュをダウンロードするリクエストを実行する必要があります。v5 では、クライアントは引き続き脅威リストのローカル データベースをダウンロードして維持する必要がありますが、安全と思われるサイトのリスト(グローバル キャッシュ)をダウンロードし、このグローバル キャッシュのローカル チェックとローカル脅威リスト チェックの両方を実行することが求められます。最後に、脅威リストの接頭辞が部分的に一致するか、グローバル キャッシュに一致しない場合は、完全なハッシュをダウンロードするリクエストを実行します。(クライアントに必要な現地での処理の詳細については、以下の手順をご覧ください)。これは、デフォルトで許可からデフォルトで確認に移行することを意味します。これにより、ウェブ上の脅威の拡散が速まっていることを踏まえ、保護を強化できます。つまり、これはほぼリアルタイムで保護を提供するように設計されたプロトコルです。Google は、クライアントがより新しい Google セーフ ブラウジング データのメリットを享受できるようにすることを目標としています。
IP プライバシー
Google セーフ ブラウジング(v4 または v5)は、リクエストの処理中にユーザーの ID に関連する情報を処理しません。Cookie が送信された場合、無視されます。リクエストの送信元 IP アドレスは Google に知られていますが、Google は IP アドレスを、ネットワークの基本的なニーズ(レスポンスの送信など)と DoS 対策の目的でのみ使用します。
v5 と同時に、Safe Browsing Oblivious HTTP Gateway API というコンパニオン API も導入されます。これは、Oblivious HTTP を使用して、エンドユーザーの IP アドレスを Google から隠します。不正行為に関与していないサードパーティが、ユーザー リクエストの暗号化されたバージョンを処理し、Google に転送します。そのため、サードパーティは IP アドレスにのみアクセスでき、Google はリクエストの内容にのみアクセスできます。サードパーティが Oblivious HTTP Relay(Fastly のこのサービスなど)を運用し、Google が Oblivious HTTP Gateway を運用します。これはオプションのコンパニオン API です。Google セーフ ブラウジングと併用する場合、エンドユーザーの IP アドレスは Google に送信されなくなります。
運用モード
Google セーフ ブラウジング v5 では、クライアントは 3 つの動作モードから選択できます。
リアルタイム モード
クライアントが Google Safe Browsing v5 をリアルタイム モードで使用する場合、クライアントはローカル データベースに次の情報を保持します。(i)ホスト接尾辞/パス接頭辞 URL 式の SHA256 ハッシュ形式の、安全と思われるサイトのグローバル キャッシュ、(ii)ホスト接尾辞/パス接頭辞 URL 式の SHA256 ハッシュ プレフィックス形式の脅威リストのセット。概要は、クライアントが特定の URL を確認するたびに、グローバル キャッシュを使用してローカル チェックが実行されることです。このチェックに合格すると、ローカル脅威リストのチェックが実行されます。それ以外の場合は、クライアントは以下の説明に沿ってリアルタイムのハッシュチェックを続行します。
クライアントは、ローカル データベースに加えてローカル キャッシュを維持します。このようなローカル キャッシュは永続ストレージに保存する必要はなく、メモリ不足の場合に削除される可能性があります。
手続きの詳細な仕様は次のとおりです。
ローカルリスト モード
クライアントがこのモードで Google Safe Browsing v5 を使用する場合、クライアントの動作は v4 Update API と同様ですが、v5 の改善された API サーフェスを使用します。クライアントは、ホスト サフィックス/パス プレフィックス URL 式の SHA256 ハッシュ プレフィックス形式の脅威リストのセットをローカル データベースに保持します。クライアントが特定の URL を確認するたびに、ローカル脅威リストを使用してチェックが実行されます。一致する場合にのみ、クライアントはサーバーに接続してチェックを続行します。
上記と同様に、クライアントはローカル キャッシュも維持しますが、これは永続ストレージに保存する必要はありません。
ストレージなしのリアルタイム モード
クライアントがストレージなしのリアルタイム モードで Google セーフ ブラウジング v5 を使用する場合、クライアントは永続的なローカル データベースを維持する必要はありません。ただし、クライアントは引き続きローカル キャッシュを維持する必要があります。このようなローカル キャッシュは永続ストレージに保存する必要はなく、メモリ不足の場合に削除される可能性があります。
クライアントが特定の URL を確認するたびに、クライアントは常にサーバーに接続してチェックを行います。このモードは、v4 Lookup API のクライアントが実装するモードに似ています。
リアルタイム モードと比較して、このモードではネットワーク帯域幅の使用量が増える可能性がありますが、クライアントが永続的なローカル状態を維持するのが不便な場合に適しています。
リアルタイム URL チェックの手順
この手順は、クライアントがリアルタイム モードの操作を選択した場合に使用されます。
このプロシージャは、単一の URL u
を受け取り、SAFE
、UNSAFE
、または UNSURE
を返します。SAFE
が返された場合、その URL は Google セーフ ブラウジングで安全と見なされます。UNSAFE
が返された場合、その URL は Google セーフ ブラウジングによって安全でない可能性があると判断され、エンドユーザーへの警告の表示、受信したメールの迷惑メールフォルダへの移動、続行前にユーザーによる追加の確認を求めるなど、適切な措置を講じる必要があります。UNSURE
が返された場合は、その後、次のローカルチェック手順を使用する必要があります。
expressions
は、URLu
によって生成されたサフィックス/プレフィックス式のリストです。expressionHashes
をリストとします。要素はexpressions
の各式の SHA256 ハッシュです。expressionHashes
のhash
ごとに:hash
がグローバル キャッシュに見つかった場合は、UNSURE
を返します。
expressionHashPrefixes
をリストとします。要素はexpressionHashes
の各ハッシュの最初の 4 バイトです。expressionHashPrefixes
のexpressionHashPrefix
ごとに:- ローカル キャッシュで
expressionHashPrefix
を検索します。 - キャッシュに保存されたエントリが見つかった場合:
- 現在の時刻が有効期限より大きいかどうかを判断します。
- 大きい場合:
- 見つかったキャッシュに保存されたエントリをローカル キャッシュから削除します。
- ループを続けます。
- 大きい場合以外:
expressionHashPrefixes
からこの特定のexpressionHashPrefix
を削除します。expressionHashes
内の対応する完全なハッシュがキャッシュに保存されたエントリに存在するかどうかを確認します。- 見つかった場合は
UNSAFE
を返します。 - 見つからない場合は、ループを続行します。
- キャッシュに保存されたエントリが見つからない場合は、ループを続行します。
- ローカル キャッシュで
- RPC SearchHashes または REST メソッド hashes.search を使用して、
expressionHashPrefixes
を Google Safe Browsing v5 サーバーに送信します。エラーが発生した場合(ネットワーク エラー、HTTP エラーなど)は、UNSURE
を返します。それ以外の場合は、SB サーバーから受信したresponse
をレスポンスとして使用します。これは、脅威の性質(ソーシャル エンジニアリング、マルウェアなど)を特定する補助情報と、キャッシュの有効期限expiration
とともに完全なハッシュのリストです。 response
のfullHash
ごとに:expiration
とともにfullHash
をローカル キャッシュに挿入します。
response
のfullHash
ごとに:isFound
は、expressionHashes
でfullHash
を見つけた結果です。isFound
が False の場合は、ループを続行します。isFound
が true の場合はUNSAFE
を返します。
SAFE
を返します。
このプロトコルでは、クライアントがサーバーに expressionHashPrefixes
を送信するタイミングは指定されていますが、送信方法は意図的に指定されていません。たとえば、クライアントがすべての expressionHashPrefixes
を 1 つのリクエストで送信することは許容されます。また、クライアントが expressionHashPrefixes
内の各プレフィックスを個別のリクエストでサーバーに送信することも許容されます(並行して処理することもできます)。1 つのリクエストで送信されるハッシュ プレフィックスの数を 30 個以下に抑える限り、クライアントは expressionHashPrefixes
のハッシュ プレフィックスとともに、無関係なハッシュ プレフィックスやランダムに生成されたハッシュ プレフィックスを送信することもできます。
LocalThreat List の URL チェック手順
この手順は、クライアントがローカルリスト モードのオペレーションを選択した場合に使用されます。また、上記の RealTimeCheck プロシージャがクライアントに UNSURE
の値を返す場合にも使用されます。
このプロシージャは、単一の URL u
を受け取り、SAFE
または UNSAFE
を返します。
expressions
は、URLu
によって生成されたサフィックス/プレフィックス式のリストです。expressionHashes
をリストとします。要素はexpressions
の各式の SHA256 ハッシュです。expressionHashPrefixes
をリストとします。要素はexpressionHashes
の各ハッシュの最初の 4 バイトです。expressionHashPrefixes
のexpressionHashPrefix
ごとに:- ローカル キャッシュで
expressionHashPrefix
を検索します。 - キャッシュに保存されたエントリが見つかった場合:
- 現在の時刻が有効期限より大きいかどうかを判断します。
- 大きい場合:
- 見つかったキャッシュに保存されたエントリをローカル キャッシュから削除します。
- ループを続けます。
- 大きい場合以外:
expressionHashPrefixes
からこの特定のexpressionHashPrefix
を削除します。expressionHashes
内の対応する完全なハッシュがキャッシュに保存されたエントリに存在するかどうかを確認します。- 見つかった場合は
UNSAFE
を返します。 - 見つからない場合は、ループを続行します。
- キャッシュに保存されたエントリが見つからない場合は、ループを続行します。
- ローカル キャッシュで
expressionHashPrefixes
のexpressionHashPrefix
ごとに:- ローカル脅威リスト データベースで
expressionHashPrefix
を検索します。 - ローカル脅威リスト データベースに
expressionHashPrefix
が見つからない場合は、expressionHashPrefixes
から削除します。
- ローカル脅威リスト データベースで
- RPC SearchHashes または REST メソッド hashes.search を使用して、
expressionHashPrefixes
を Google Safe Browsing v5 サーバーに送信します。エラーが発生した場合(ネットワーク エラー、HTTP エラーなど)は、SAFE
を返します。それ以外の場合は、SB サーバーから受信したresponse
をレスポンスとして使用します。これは、脅威の性質(ソーシャル エンジニアリング、マルウェアなど)を特定する補助情報と、キャッシュの有効期限expiration
とともに完全なハッシュのリストです。 response
のfullHash
ごとに:expiration
とともにfullHash
をローカル キャッシュに挿入します。
response
のfullHash
ごとに:isFound
は、expressionHashes
でfullHash
を見つけた結果です。isFound
が False の場合は、ループを続行します。isFound
が true の場合はUNSAFE
を返します。
SAFE
を返します。
ローカル データベースを使用しないリアルタイム URL チェック手順
この手順は、クライアントがストレージなしのリアルタイム モードの動作を選択した場合に使用されます。
このプロシージャは、単一の URL u
を受け取り、SAFE
または UNSAFE
を返します。
expressions
は、URLu
によって生成されたサフィックス/プレフィックス式のリストです。expressionHashes
をリストとします。要素はexpressions
の各式の SHA256 ハッシュです。expressionHashPrefixes
をリストとします。要素はexpressionHashes
の各ハッシュの最初の 4 バイトです。expressionHashPrefixes
のexpressionHashPrefix
ごとに:- ローカル キャッシュで
expressionHashPrefix
を検索します。 - キャッシュに保存されたエントリが見つかった場合:
- 現在の時刻が有効期限より大きいかどうかを判断します。
- 大きい場合:
- 見つかったキャッシュに保存されたエントリをローカル キャッシュから削除します。
- ループを続けます。
- 大きい場合以外:
expressionHashPrefixes
からこの特定のexpressionHashPrefix
を削除します。expressionHashes
内の対応する完全なハッシュがキャッシュに保存されたエントリに存在するかどうかを確認します。- 見つかった場合は
UNSAFE
を返します。 - 見つからない場合は、ループを続行します。
- キャッシュに保存されたエントリが見つからない場合は、ループを続行します。
- ローカル キャッシュで
- RPC SearchHashes または REST メソッド hashes.search を使用して、Google Safe Browsing v5 サーバーに
expressionHashPrefixes
を送信します。エラーが発生した場合(ネットワーク エラー、HTTP エラーなど)は、SAFE
を返します。それ以外の場合は、SB サーバーから受信したresponse
をレスポンスとして使用します。これは、脅威の性質(ソーシャル エンジニアリング、マルウェアなど)を特定する補助情報と、キャッシュの有効期限expiration
とともに完全なハッシュのリストです。 response
のfullHash
ごとに:expiration
とともにfullHash
をローカル キャッシュに挿入します。
response
のfullHash
ごとに:isFound
は、expressionHashes
でfullHash
を見つけた結果です。isFound
が False の場合は、ループを続行します。isFound
が true の場合はUNSAFE
を返します。
SAFE
を返します。
リアルタイム URL チェック手順と同様に、この手順では、ハッシュ接頭辞をサーバーに送信する方法は明記されていません。たとえば、クライアントがすべての expressionHashPrefixes
を 1 つのリクエストで送信することは許容されます。また、クライアントが expressionHashPrefixes
の各プレフィックスを個別のリクエストでサーバーに送信することも許容されます(並行して処理することもできます)。1 つのリクエストで送信されるハッシュ プレフィックスの数を 30 個以下に抑える限り、クライアントは expressionHashPrefixes
のハッシュ プレフィックスとともに、無関係なハッシュ プレフィックスやランダムに生成されたハッシュ プレフィックスを送信することもできます。
リクエストの例
このセクションでは、HTTP API を直接使用して Google セーフ ブラウジングにアクセスする例をいくつか示します。通常は、生成された言語バインディングを使用することをおすすめします。これは、エンコードとデコードが便利な方法で自動的に処理されるためです。該当するバインディングのドキュメントをご覧ください。
hashes.search メソッドを使用する HTTP リクエストの例を次に示します。
GET https://safebrowsing.googleapis.com/v5/hashes:search?key=INSERT_YOUR_API_KEY_HERE&hashPrefixes=WwuJdQ
レスポンス本文はプロトコル バッファ形式のペイロードで、デコードできます。
hashLists.batchGet メソッドを使用した HTTP リクエストの例を次に示します。
GET https://safebrowsing.googleapis.com/v5alpha1/hashLists:batchGet?key=INSERT_YOUR_API_KEY_HERE&names=se&names=mw-4b
レスポンスの本文は、プロトコル バッファ形式のペイロードであり、デコードできます。