Safe Browsing Update API (v4)

概览

借助 API,您的客户端应用可以下载经过哈希处理的安全浏览列表,以存储在本地数据库中。然后,您可以在本地检查网址。仅当在本地数据库中发现匹配项时,客户端才需要向安全浏览服务器发送请求,以验证相应网址是否包含在“安全浏览”列表中。

在使用 Update API 之前,您需要设置本地数据库。安全浏览功能提供了一个 Go 软件包,您可以放心地开始使用。如需了解详情,请参阅本地数据库下的“数据库设置”部分。

更新本地数据库

为了保持最新状态,客户端必须定期更新其本地数据库中的安全浏览列表。为了节省带宽,客户端会下载网址的哈希前缀,而不是原始网址。例如,如果“www.badurl.com/”位于安全浏览列表中,则客户端会下载该网址的 SHA256 哈希前缀,而不是网址本身。在大多数情况下,哈希前缀的长度为 4 个字节,这意味着,下载单个列表条目的平均带宽成本为压缩前 4 个字节。

如需更新本地数据库中的安全浏览列表,请向 threatListUpdates.fetch 方法发送 HTTP POST 请求:

  • HTTP POST 请求包含要更新的列表的名称,以及用于满足内存和带宽限制的各种客户端限制。
  • HTTP POST 响应会返回完整更新或部分更新。响应也可以返回最短等待时长。

示例:threatListUpdates.fetch

HTTP POST 请求

在以下示例中,请求了单个安全浏览列表的更新。

请求标头

请求标头包含请求网址和内容类型。请记得将 API 密钥中的网址替换为 API_KEY

POST https://safebrowsing.googleapis.com/v4/threatListUpdates:fetch?key=API_KEY HTTP/1.1
Content-Type: application/json

请求正文

请求正文包含客户端信息(ID 和版本)和更新信息(列表名称、列表状态和客户端约束条件)。如需了解详情,请参阅 threatListUpdates.fetch 请求正文以及代码示例之后的说明。

{
  "client": {
    "clientId":       "yourcompanyname",
    "clientVersion":  "1.5.2"
  },
  "listUpdateRequests": [{
    "threatType":      "MALWARE",
    "platformType":    "WINDOWS",
    "threatEntryType": "URL",
    "state":           "Gg4IBBADIgYQgBAiAQEoAQ==",
    "constraints": {
      "maxUpdateEntries":      2048,
      "maxDatabaseEntries":    4096,
      "region":                "US",
      "supportedCompressions": ["RAW"]
    }
  }]
}
客户信息

clientIDclientVersion 字段应该唯一标识客户端实现,而不是单个用户。(客户端日志记录用于客户端信息。您可以为客户端 ID 选择任何名称,但我们建议您选择一个代表客户端真实身份的名称,例如,您的公司名称将以一个全小写字母表示的单词。)

安全浏览列表

系统会合并 threatTypeplatformTypethreatEntryType 字段以标识(安全浏览)安全浏览列表。该示例标识了一个列表:MALWARE/WINDOWS/网址。在发送请求之前,请确保您指定的类型组合有效(请参阅安全浏览列表)。

客户端状态

state 字段包含安全浏览列表的当前客户端状态。(threatListUpdates.fetch 响应newClientState 字段中会返回客户端状态。)对于初始更新,请将 state 字段留空。

尺寸限制

maxUpdateEntries 字段指定客户端可以管理的更新总数(在此示例中为 2048)。maxDatabaseEntries 字段指定本地数据库可以管理的条目总数(在此示例中为 4096)。只有在客户端存在内存或带宽限制时,才应设置大小限制(请参阅更新限制)。

支持压缩

supportedCompressions 字段列出了客户端支持的压缩类型。在此示例中,客户端仅支持未压缩的原始数据。但是,安全浏览功能支持其他压缩类型(请参阅压缩)。

HTTP POST 响应

在此示例中,响应会使用请求的压缩类型返回安全浏览列表的部分更新。

响应标头

响应标头包含 HTTP 状态代码和内容类型。收到 HTTP/200 以外的状态代码的客户端必须进入退避模式(请参阅请求频率)。

HTTP/1.1 200 OK
Content-Type: application/json

响应正文

响应正文包含更新信息(列表名称、响应类型、要应用于本地数据库的添加和移除操作、新客户端状态以及校验和)。在此示例中,响应还包含最短等待时长。如需了解详情,请参阅 threatListUpdates.fetch 响应正文以及代码示例之后的说明。

{
  "listUpdateResponses": [{
    "threatType":      "MALWARE",
    "threatEntryType": "URL",
    "platformType":    "WINDOWS",
    "responseType" :   "PARTIAL_UPDATE",
    "additions": [{
      "compressionType": "RAW",
      "rawHashes": {
        "prefixSize": 4,
        "rawHashes":  "rnGLoQ=="
      }
    }],
    "removals": [{
      "compressionType": "RAW",
      "rawIndices": {
        "indices": [0, 2, 4]
      }
    }],
    "newClientState": "ChAIBRADGAEiAzAwMSiAEDABEAFGpqhd",
    "checksum": {
      "sha256": "YSgoRtsRlgHDqDA3LAhM1gegEpEzs1TjzU33vqsR8iM="
    }
  }],
  "minimumWaitDuration": "593.440s"
}
数据库更新

responseType 字段将指示部分更新或完整更新。在此示例中,系统会返回部分更新,因此响应中同时包含添加和移除。可能会有多组添加,但只有一组移除(请参阅数据库更新)。

新客户状态

newClientState 字段包含最近更新的安全浏览列表的新客户端状态。客户端必须保存新的客户端状态以用于后续更新请求(threatListUpdates.fetch 请求中的 state 字段或 fullHashes.find 请求中的 clientStates 字段)。

校验和

通过校验和,客户端可以验证本地数据库未出现任何损坏。如果校验和不匹配,客户端必须清除数据库并使用空 state 字段重新发出更新。但是,在这种情况下,客户端仍必须遵循更新的时间间隔(请参阅请求频率)。

最短等待时长

minimumWaitDuration 字段指示客户端必须等待 593.44 秒(9.89 分钟)才能发送其他更新请求。请注意,等待中不一定包含等待期(请参阅请求频率)。

检查网址

如需检查某个网址是否在“安全浏览”列表中,客户端必须先计算该网址的哈希和哈希前缀(请参阅网址和哈希)。然后,客户端会查询本地数据库以确定是否存在匹配项。如果本地数据库中不存在哈希前缀,则该网址将被视为安全网址(不在“安全浏览”列表中)。

如果本地数据库中存在哈希前缀(哈希前缀冲突),客户端必须将哈希前缀发送到安全浏览服务器以进行验证。服务器将返回包含给定哈希前缀的所有完整 SHA 256 哈希。如果其中一个全长哈希与相关网址的完整长度哈希值匹配,则该网址会被视为不安全。如果没有与相关网址的完整长度哈希匹配的完整网址,则该网址会被视为安全网址。

Google 绝不会了解您正在检查的网址。Google 确实会获取网址的哈希前缀,但哈希前缀并不能提供有关实际网址的太多信息。

如需检查某个网址是否在“安全浏览”列表中,请向 fullHashes.find 方法发送 HTTP POST 请求:

  • HTTP POST 请求最多可包含 500 个威胁条目。
  • HTTP POST 请求包含所检查网址的哈希前缀。我们建议客户端在单个请求中批量处理多个威胁条目,以降低带宽用量。
  • HTTP POST 响应会返回匹配的完整长度哈希值以及正向和负缓存时长。响应也可以返回最短等待时长。

示例:fullHashes.find

HTTP POST 请求

在以下示例中,系统会发送两个安全浏览列表的名称以及三个哈希前缀,以用于比较和验证。

请求标头

请求标头包含请求网址和内容类型。请记得将 API 密钥中的网址替换为 API_KEY

POST https://safebrowsing.googleapis.com/v4/fullHashes:find?key=API_KEY HTTP/1.1
Content-Type: application/json

请求正文

请求正文包含客户端信息(ID 和版本)、客户端状态以及威胁信息(列表名称和哈希前缀)。对于 JSON 请求,必须以 base64 编码形式发送哈希前缀。如需了解详情,请参阅 fullHashes.find 请求正文以及代码示例之后的说明。

{
  "client": {
    "clientId":      "yourcompanyname",
    "clientVersion": "1.5.2"
  },
  "clientStates": [
    "ChAIARABGAEiAzAwMSiAEDABEAE=",
    "ChAIAhABGAEiAzAwMSiAEDABEOgH"
  ],
  "threatInfo": {
    "threatTypes":      ["MALWARE", "SOCIAL_ENGINEERING"],
    "platformTypes":    ["WINDOWS"],
    "threatEntryTypes": ["URL"],
    "threatEntries": [
      {"hash": "WwuJdQ=="},
      {"hash": "771MOg=="},
      {"hash": "5eOrwQ=="}
    ]
  }
}
客户信息

clientIDclientVersion 字段应该唯一标识客户端实现,而不是单个用户。(客户端日志记录用于客户端信息。您可以为客户端 ID 选择任何名称,但我们建议您选择一个代表客户端真实身份的名称,例如,您的公司名称将以一个全小写字母表示的单词。)

所有客户端状态

clientStates 字段包含客户端本地数据库中所有安全浏览列表的客户端状态。(在 threatListUpdates.fetch 响应newClientState 字段中会返回客户端状态。)

安全浏览列表

threatTypesplatformTypesthreatEntryTypes 字段相结合可标识(命名)安全浏览列表。此示例中列出了两个列表:MALWARE/WINDOWS/网址 和 SOCIAL_ENGINEERING/WINDOWS/网址。在发送请求之前,请确保您指定的类型组合有效(请参阅安全浏览列表)。

威胁哈希前缀

threatEntries 数组包含您要检查的网址的哈希前缀。 hash 字段必须包含本地数据库中确切的哈希前缀。例如,如果本地哈希前缀的长度为 4 个字节,则威胁条目的长度必须为 4 个字节。如果本地哈希前缀延长到 7 个字节,威胁条目的长度必须为 7 个字节。

在此示例中,请求包含三个哈希前缀。系统会将三个前缀与每个安全浏览列表进行比较,以确定是否存在匹配的完整长度哈希值。

注意:Update API 和 fullHashes.find 方法应始终使用 hash 字段,而绝不使用 URL 字段(请参阅 ThreatEntry)。

HTTP POST 响应

在以下示例中,响应将返回按安全浏览列表整理的匹配数据以及缓存和等待时长。

响应标头

响应标头包含 HTTP 状态代码和内容类型。收到 HTTP/200 以外的状态代码的客户端必须退避(请参阅请求频率)。

HTTP/1.1 200 OK
Content-Type: application/json

响应正文

响应正文包含匹配信息(列表名称和完整长度哈希值、元数据(如果有)和缓存时长)。在此示例中,响应正文还包含最短等待时长。如需了解详情,请参阅 fullHashes.find 响应正文以及代码示例之后的说明。

{
  "matches": [{
    "threatType":      "MALWARE",
    "platformType":    "WINDOWS",
    "threatEntryType": "URL",
    "threat": {
      "hash": "WwuJdQx48jP-4lxr4y2Sj82AWoxUVcIRDSk1PC9Rf-4="
    },
    "threatEntryMetadata": {
      "entries": [{
        "key": "bWFsd2FyZV90aHJlYXRfdHlwZQ==",  // base64-encoded "malware_threat_type"
        "value": "TEFORElORw=="  // base64-encoded "LANDING"
       }]
    },
    "cacheDuration": "300.000s"
  }, {
    "threatType":      "SOCIAL_ENGINEERING",
    "platformType":    "WINDOWS",
    "threatEntryType": "URL",
    "threat": {
      "hash": "771MOrRPMn6xPKlCrXx_CrR-wmCk0LgFFoSgGy7zUiA="
    },
    "threatEntryMetadata": {
      "entries": []
    },
    "cacheDuration": "300.000s"
  }],
  "minimumWaitDuration": "300.000s",
  "negativeCacheDuration": "300.000s"
}
匹配项

匹配对象会返回与两个哈希前缀匹配的完整长度哈希值。这些哈希对应的网址会被视为不安全。第三个哈希前缀未找到匹配项,因此不会返回任何内容;与此哈希前缀对应的网址被视为安全网址。

请注意,此示例将一个完整长度的哈希与一个哈希前缀匹配;然而,可能有多个映射到同一个哈希前缀的完整的哈希。

元数据

threatEntryMetadata 字段是可选字段,它提供关于威胁匹配的更多信息。目前,MALWARE/WINDOWS/网址 安全浏览列表提供了元数据(请参阅元数据)。

缓存时长

cacheDurationnegativeCacheDuration 字段指示哈希必须被视为不安全或安全的时间(请参阅缓存)。

最短等待时长

minimumWaitDuration 字段指示客户端必须等待 300 秒(5 分钟)才能发送另一个 fullHashes 请求。请注意,等待中不一定包含等待期(请参阅请求频率)。