Введение
Примечание. Эта документация в настоящее время все еще находится в стадии разработки. Ожидайте улучшения в ближайшем будущем.
Google Safe Browsing v5 — это развитие Google Safe Browsing v4. Двумя ключевыми изменениями, внесенными в версию 5, являются актуальность данных и конфиденциальность IP. Кроме того, поверхность API была улучшена для повышения гибкости, эффективности и уменьшения раздувания. Кроме того, Google Safe Browsing v5 упрощает переход с версии 4.
В настоящее время Google предлагает версии 4 и 5, и обе версии считаются готовыми к производству. Вы можете использовать либо v4, либо v5. Мы не объявили дату прекращения поддержки версии 4; если мы это сделаем, мы уведомим вас минимум за один год. На этой странице будет описана версия 5, а также руководство по переходу с версии 4 на версию 5; Полная документация по версии 4 остается доступной .
Свежесть данных
Одним из существенных улучшений Google Safe Browsing v5 по сравнению с v4 (в частности, API обновления v4 ) является актуальность и охват данных. Поскольку защита сильно зависит от локальной базы данных, обслуживаемой клиентом, задержка и размер обновления локальной базы данных являются основной причиной отсутствия защиты. В версии 4 обычному клиенту требуется от 20 до 50 минут для получения самой последней версии списков угроз. К сожалению, фишинговые атаки распространяются быстро: по состоянию на 2021 год 60% сайтов, подвергающихся атакам, живут менее 10 минут. Наш анализ показывает, что около 25–30% случаев отсутствия защиты от фишинга связано с устаревшими данными. Кроме того, некоторые устройства не оснащены для управления всеми списками угроз Google Safe Browsing, которые со временем продолжают расти.
В версии 5 мы ввели режим работы, известный как защита в реальном времени. Это позволяет обойти описанную выше проблему устаревания данных. В версии 4 ожидается, что клиенты будут загружать и поддерживать локальную базу данных, выполнять проверки на соответствие локально загруженным спискам угроз, а затем, при частичном совпадении префикса, выполнять запрос на загрузку полного хэша. В версии 5, хотя клиенты должны продолжать загружать и поддерживать локальную базу данных списков угроз, теперь ожидается, что клиенты также будут загружать список вероятно безопасных сайтов (называемый глобальным кэшем), а также выполнять локальную проверку этого глобального кэша. в качестве проверки локального списка угроз, и, наконец, когда в глобальном кэше есть частичное совпадение префиксов для списков угроз или отсутствие совпадений, выполните запрос на загрузку полных хэшей. (Подробную информацию о локальной обработке, необходимой клиенту, см. в описанной ниже процедуре.) Это представляет собой переход от «разрешения по умолчанию» к «проверке по умолчанию», что может улучшить защиту в свете более быстрого распространения угроз на сеть. Другими словами, это протокол, предназначенный для обеспечения защиты практически в реальном времени: мы стремимся, чтобы клиенты получали выгоду от более свежих данных Google Safe Browsing.
IP-конфиденциальность
Google Safe Browsing (v4 или v5) не обрабатывает ничего, связанное с личностью пользователя, в ходе обслуживания запросов. Файлы cookie, если они отправлены, игнорируются. Исходные IP-адреса запросов известны Google, но Google использует IP-адреса только для основных сетевых нужд (т. е. для отправки ответов) и в целях защиты от DoS-атак.
Одновременно с версией 5 мы представляем сопутствующий API, известный как API безопасного просмотра Oblivious HTTP Gateway. При этом используется Oblivious HTTP , чтобы скрыть IP-адреса конечных пользователей от Google. Он работает за счет того, что третья сторона, не вступающая в сговор, обрабатывает зашифрованную версию запроса пользователя, а затем пересылает ее в Google. Таким образом, третья сторона имеет доступ только к IP-адресам, а Google имеет доступ только к содержимому запроса. Третья сторона управляет Oblivious HTTP Relay (например , этой службой Fastly ), а Google управляет Oblivious HTTP Gateway. Это необязательный сопутствующий API. При использовании его в сочетании с Google Safe Browsing IP-адреса конечных пользователей больше не передаются в Google.
Надлежащее использование
Разрешенное использование
API безопасного просмотра предназначен только для некоммерческого использования (что означает «не для продажи или получения дохода»). Если вам нужно решение для коммерческих целей, обратитесь к веб-риску .
Цены
Все API безопасного просмотра Google бесплатны.
Квоты
Разработчикам выделяется квота использования по умолчанию при включении API безопасного просмотра. Текущее распределение и использование можно просмотреть в консоли разработчика Google . Если вы планируете использовать больше, чем выделенная вам квота, вы можете запросить дополнительную квоту через интерфейс квот консоли разработчика . Мы рассматриваем эти запросы и требуем контактного лица при подаче заявки на увеличение квоты, чтобы гарантировать, что доступность наших услуг соответствует потребностям всех пользователей.
Соответствующие URL-адреса
Google Safe Browsing предназначен для воздействия на URL-адреса, которые будут отображаться в адресной строке браузера. Он не предназначен для проверки подресурсов (таких как JavaScript или изображение, на которое ссылается HTML-файл, или URL-адрес WebSocket, инициированный JavaScript). Такие URL-адреса подресурсов не следует проверять на соответствие Google Safe Browsing.
Если посещение URL-адреса приводит к перенаправлению (например, HTTP 301), целесообразно проверить перенаправленный URL-адрес на соответствие Google Safe Browsing. Манипулирование URL-адресами на стороне клиента, такое как History.pushState
, не приводит к проверке новых URL-адресов на соответствие Google Safe Browsing.
Предупреждения пользователя
Если вы используете Google Safe Browsing, чтобы предупреждать пользователей о рисках, связанных с определенными веб-страницами, применяются следующие рекомендации.
Эти рекомендации помогают защитить и вас, и Google от недопонимания, поскольку они ясно дают понять, что страница не является со 100% уверенностью небезопасным веб-ресурсом и что предупреждения просто указывают на возможный риск.
- В своем видимом для пользователя предупреждении вы не должны заставлять пользователей поверить в то, что рассматриваемая страница, без сомнения, является небезопасным веб-ресурсом. Когда вы ссылаетесь на идентифицированную страницу или на потенциальные риски, которые она может представлять для пользователей, вы должны квалифицировать предупреждение, используя такие термины, как: подозрительно, потенциально, возможно, вероятно, может быть.
- Ваше предупреждение должно позволить пользователю узнать больше, ознакомившись с определениями различных угроз Google. Предлагаются следующие ссылки:
- Социальная инженерия: https://developers.google.com/search/docs/monitor-debug/security/social-engineering .
- Вредоносное и нежелательное программное обеспечение: https://developers.google.com/search/docs/monitor-debug/security/malware .
- Потенциально опасные приложения (только для Android): https://developers.google.com/android/play-protect/potentially-harmful-applications.
- Когда вы показываете предупреждения для страниц, определенных Службой безопасного просмотра как опасные, вы должны указать Google, включив строку «Рекомендации, предоставленные Google» со ссылкой на рекомендации по безопасному просмотру . Если ваш продукт также показывает предупреждения, основанные на других источниках, вы не должны включать атрибуцию Google в предупреждения, полученные на основе данных, не принадлежащих Google.
В документации к вашему продукту вы должны предоставить уведомление, информирующее пользователей о том, что защита, обеспечиваемая безопасным просмотром Google, не идеальна. Он должен сообщить им, что существует вероятность как ложноположительных результатов (безопасные сайты помечены как опасные), так и ложноотрицательных (рискованные сайты не помечены). Мы предлагаем использовать следующий язык:
Google стремится предоставлять максимально точную и актуальную информацию о небезопасных веб-ресурсах. Однако Google не может гарантировать, что ее информация является полной и безошибочной: некоторые опасные сайты могут быть не идентифицированы, а некоторые безопасные сайты могут быть идентифицированы ошибочно.
Режимы работы
Google Safe Browsing v5 позволяет клиентам выбирать один из трех режимов работы.
Режим реального времени
Когда клиенты решают использовать Google Safe Browsing v5 в режиме реального времени, они будут хранить в своей локальной базе данных: (i) глобальный кеш потенциально безопасных сайтов, отформатированный как хэши SHA256 выражений URL-суффикса хоста/префикса пути; (ii) набор списков угроз, отформатированных как хеш-префиксы SHA256 выражений URL-адресов суффикса хоста/префикса пути. Идея высокого уровня заключается в том, что всякий раз, когда клиент желает проверить определенный URL-адрес, выполняется локальная проверка с использованием глобального кэша. Если эта проверка пройдена, выполняется проверка локальных списков угроз. В противном случае клиент продолжит проверку хеша в реальном времени, как описано ниже.
Помимо локальной базы данных, клиент будет поддерживать локальный кэш. Такой локальный кэш не обязательно должен находиться в постоянном хранилище и может быть очищен в случае нехватки памяти.
Подробное описание процедуры представлено ниже.
Режим локального списка
Когда клиенты решают использовать Google Safe Browsing v5 в этом режиме, поведение клиента аналогично API обновления v4, за исключением использования улучшенной поверхности API v5. Клиенты будут хранить в своей локальной базе данных набор списков угроз, отформатированных как хэш-префиксы SHA256 выражений URL-адресов суффикса хоста/префикса пути. Всякий раз, когда клиент желает проверить определенный URL-адрес, проверка выполняется с использованием локального списка угроз. Если и только если есть совпадение, клиент подключается к серверу, чтобы продолжить проверку.
Как и в предыдущем случае, клиент также будет поддерживать локальный кеш, который не обязательно должен находиться в постоянном хранилище.
Режим реального времени без хранения
Когда клиенты решают использовать Google Safe Browsing v5 в режиме реального времени без хранения, им не нужно поддерживать какую-либо постоянную локальную базу данных. Однако ожидается, что клиент по-прежнему будет поддерживать локальный кеш. Такой локальный кэш не обязательно должен находиться в постоянном хранилище и может быть очищен в случае нехватки памяти.
Всякий раз, когда клиент желает проверить определенный URL-адрес, он всегда подключается к серверу для выполнения проверки. Этот режим аналогичен тому, что могут реализовать клиенты API поиска версии 4.
По сравнению с режимом реального времени этот режим может использовать большую пропускную способность сети, но может быть более подходящим, если клиенту неудобно поддерживать постоянное локальное состояние.
Проверка URL-адресов
В этом разделе содержатся подробные сведения о том, как клиенты проверяют URL-адреса.
Канонизация URL-адресов
Прежде чем какие-либо URL-адреса будут проверены, ожидается, что клиент выполнит некоторую канонизацию этого URL-адреса.
Для начала мы предполагаем, что клиент проанализировал URL-адрес и сделал его действительным в соответствии с RFC 2396. Если URL-адрес использует интернационализированное доменное имя (IDN), клиент должен преобразовать URL-адрес в представление Punycode ASCII. URL-адрес должен включать компонент пути; то есть после домена должна быть хотя бы одна косая черта ( http://google.com/
вместо http://google.com
).
Сначала удалите из URL-адреса символы табуляции (0x09), CR (0x0d) и LF (0x0a). Не удаляйте escape-последовательности для этих символов (например, %0a
).
Во-вторых, если URL-адрес заканчивается фрагментом, удалите этот фрагмент. Например, сократите http://google.com/#frag
до http://google.com/
.
В-третьих, несколько раз удаляйте процентное экранирование URL-адреса, пока на нем не останется процентного экранирования. (Это может сделать URL-адрес недействительным.)
Чтобы канонизировать имя хоста:
Извлеките имя хоста из URL-адреса, а затем:
- Удалите все ведущие и конечные точки.
- Замените последовательные точки одной точкой.
- Если имя хоста можно проанализировать как адрес IPv4, нормализуйте его до 4 десятичных значений, разделенных точками. Клиент должен обрабатывать любую допустимую кодировку IP-адреса, включая восьмеричную, шестнадцатеричную и менее четырех компонентов.
- Если имя хоста можно проанализировать как IPv6-адрес в квадратных скобках, нормализуйте его, удалив ненужные начальные нули в компонентах и свернув нулевые компоненты, используя синтаксис двойного двоеточия. Например,
[2001:0db8:0000::1]
следует преобразовать в[2001:db8::1]
. Если имя хоста является одним из двух следующих специальных типов адресов IPv6, преобразуйте их в IPv4:- Адрес IPv6, сопоставленный с IPv4, например
[::ffff:1.2.3.4]
, который должен быть преобразован в1.2.3.4
; - Адрес NAT64 с известным префиксом 64:ff9b::/96 , например
[64:ff9b::1.2.3.4]
, который следует преобразовать в1.2.3.4
.
- Адрес IPv6, сопоставленный с IPv4, например
- В нижнем регистре всю строку.
Чтобы канонизировать путь:
- Разрешите последовательности
/../
и/./
в пути, заменив/./
на/
и удалив/../
вместе с предыдущим компонентом пути. - Замените серию последовательных косых черт одним символом косой черты.
Не применяйте канонизацию путей к параметрам запроса.
В URL-адресе экранируйте процентами все символы <= ASCII 32, >= 127, #
или %
. В escape-последовательности следует использовать шестнадцатеричные символы верхнего регистра.
Выражения префикса пути и суффикса хоста
После канонизации URL-адреса следующим шагом будет создание выражений суффикса/префикса. Каждое выражение суффикса/префикса состоит из суффикса хоста (или полного хоста) и префикса пути (или полного пути).
Клиент сформирует до 30 различных возможных комбинаций суффикса хоста и префикса пути. Эти комбинации используют только компоненты хоста и пути URL-адреса. Схема, имя пользователя, пароль и порт удаляются. Если URL-адрес включает параметры запроса, то хотя бы одна комбинация будет включать полный путь и параметры запроса.
Для хоста клиент будет пробовать не более пяти разных строк. Они есть:
- Если имя хоста не является литералом IPv4 или IPv6, до четырех имен хостов формируются путем начала с домена eTLD+1 и последовательного добавления ведущих компонентов. Определение eTLD+1 должно основываться на списке общедоступных суффиксов . Например,
abexample.com
приведет к домену eTLD+1example.com
, а также к хосту с одним дополнительным компонентом хостаb.example.com
. - Точное имя хоста в URL. Следуя предыдущему примеру, будет проверен
abexample.com
.
Для пути клиент попробует не более шести разных строк. Они есть:
- Точный путь URL-адреса, включая параметры запроса.
- Точный путь URL-адреса без параметров запроса.
- Четыре пути формируются путем начала с корня (/) и последовательного добавления компонентов пути, включая косую черту в конце.
Следующие примеры иллюстрируют поведение проверки:
Для URL-адреса http://abcom/1/2.html?param=1
клиент попытается использовать следующие возможные строки:
a.b.com/1/2.html?param=1
a.b.com/1/2.html
a.b.com/
a.b.com/1/
b.com/1/2.html?param=1
b.com/1/2.html
b.com/
b.com/1/
Для URL-адреса http://abcdefcom/1.html
клиент будет пробовать следующие возможные строки:
a.b.c.d.e.f.com/1.html
a.b.c.d.e.f.com/
c.d.e.f.com/1.html
c.d.e.f.com/
d.e.f.com/1.html
d.e.f.com/
e.f.com/1.html
e.f.com/
f.com/1.html
f.com/
(Примечание: пропустите bcdefcom
, поскольку мы возьмем только пять последних компонентов имени хоста и полное имя хоста.)
Для URL-адреса http://1.2.3.4/1/
клиент попробует следующие возможные строки:
1.2.3.4/1/
1.2.3.4/
Для URL-адреса http://example.co.uk/1
клиент будет пробовать следующие возможные строки:
example.co.uk/1
example.co.uk/
Хеширование
Google Safe Browsing использует исключительно SHA256 в качестве хэш-функции. Эту хэш-функцию следует применить к приведенным выше выражениям.
Полный 32-байтовый хэш будет, в зависимости от обстоятельств, сокращен до 4, 8 или 16 байт:
При использовании метода hashes.search мы в настоящее время требуем, чтобы хеши в запросе были усечены ровно до 4 байт. Отправка дополнительных байтов в этом запросе поставит под угрозу конфиденциальность пользователя.
При загрузке списков для локальной базы данных с помощью метода hashList.get или метода hashLists.batchGet на длину хешей, отправляемых сервером, влияет как природа списка, так и предпочтения клиента в отношении длины хеша, передаваемые параметр
desired_hash_length
.
Процедура проверки URL-адреса в реальном времени
Данная процедура используется, когда клиент выбирает режим работы в реальном времени.
Эта процедура принимает один URL-адрес u
и возвращает SAFE
, UNSAFE
или UNSURE
. Если он возвращает SAFE
URL-адрес считается безопасным с точки зрения безопасного просмотра Google. Если он возвращает UNSAFE
URL-адрес считается потенциально небезопасным безопасным просмотром Google, и необходимо предпринять соответствующие действия: например, показать предупреждение конечному пользователю, переместить полученное сообщение в папку со спамом или потребовать от пользователя дополнительного подтверждения перед продолжением. Если он возвращает UNSURE
, после этого следует использовать следующую процедуру локальной проверки.
- Пусть
expressions
представляют собой список выражений суффиксов/префиксов, сгенерированных URL-адресомu
. - Пусть
expressionHashes
будет списком, элементами которого являются хэши SHA256 каждого выражения вexpressions
. - Для каждого
hash
expressionHashes
:- Если
hash
можно найти в глобальном кеше, вернитеUNSURE
.
- Если
- Пусть
expressionHashPrefixes
будет списком, элементами которого являются первые 4 байта каждого хеша вexpressionHashes
. - Для каждого
expressionHashPrefix
изexpressionHashPrefixes
:- Найдите
expressionHashPrefix
в локальном кеше. - Если кэшированная запись найдена:
- Определите, превышает ли текущее время время его истечения.
- Если оно больше:
- Удалите найденную кэшированную запись из локального кэша.
- Продолжайте цикл.
- Если оно не больше:
- Удалите это конкретное
expressionHashPrefix
изexpressionHashPrefixes
. - Проверьте, найден ли соответствующий полный хэш внутри
expressionHashes
в кэшированной записи. - Если найдено, верните
UNSAFE
. - Если не найден, продолжите цикл.
- Удалите это конкретное
- Если кэшированная запись не найдена, продолжите цикл.
- Найдите
- Отправьте
expressionHashPrefixes
на сервер Google Safe Browsing v5 с помощью RPC SearchHashes или метода REST hashes.search . Если произошла ошибка (включая сетевые ошибки, ошибки HTTP и т. д.), вернитеUNSURE
. В противном случае, пусть ответом будетresponse
, полученный от сервера SB, который представляет собой список полных хешей вместе с некоторой вспомогательной информацией, идентифицирующей характер угрозы (социальная инженерия, вредоносное ПО и т. д.), а такжеexpiration
действия кэша. - Для каждого
fullHash
response
:- Вставьте
fullHash
в локальный кеш вместе сexpiration
.
- Вставьте
- Для каждого
fullHash
response
:- Пусть
isFound
будет результатом поискаfullHash
вexpressionHashes
. - Если
isFound
имеет значение False, продолжите цикл. - Если
isFound
имеет значение True, вернитеUNSAFE
.
- Пусть
- Возврат
SAFE
.
Хотя этот протокол определяет , когда клиент отправляет expressionHashPrefixes
на сервер, этот протокол намеренно не определяет , как именно их отправлять. Например, клиент может отправлять все expressionHashPrefixes
в одном запросе, а также допустимо, чтобы клиент отправлял каждый отдельный префикс в expressionHashPrefixes
на сервер в отдельных запросах (возможно, выполняемых параллельно). Клиенту также разрешено отправлять несвязанные или случайно сгенерированные хэш-префиксы вместе с хэш-префиксами в expressionHashPrefixes
, если количество хэш-префиксов, отправленных в одном запросе, не превышает 30.
Процедура проверки URL-адреса списка LocalThreat
Эта процедура используется, когда клиент выбирает режим работы локального списка. Он также используется, когда клиент описанная выше процедура RealTimeCheck возвращает значение UNSURE
.
Эта процедура принимает один URL-адрес u
и возвращает SAFE
или UNSAFE
.
- Пусть
expressions
представляют собой список выражений суффиксов/префиксов, сгенерированных URL-адресомu
. - Пусть
expressionHashes
будет списком, элементами которого являются хэши SHA256 каждого выражения вexpressions
. - Пусть
expressionHashPrefixes
будет списком, элементами которого являются первые 4 байта каждого хеша вexpressionHashes
. - Для каждого
expressionHashPrefix
изexpressionHashPrefixes
:- Найдите
expressionHashPrefix
в локальном кеше. - Если кэшированная запись найдена:
- Определите, превышает ли текущее время время его истечения.
- Если оно больше:
- Удалите найденную кэшированную запись из локального кэша.
- Продолжайте цикл.
- Если оно не больше:
- Удалите это конкретное
expressionHashPrefix
изexpressionHashPrefixes
. - Проверьте, найден ли соответствующий полный хэш внутри
expressionHashes
в кэшированной записи. - Если найдено, верните
UNSAFE
. - Если не найден, продолжите цикл.
- Удалите это конкретное
- Если кэшированная запись не найдена, продолжите цикл.
- Найдите
- Для каждого
expressionHashPrefix
изexpressionHashPrefixes
:- Найдите
expressionHashPrefix
в базе данных локального списка угроз. - Если
expressionHashPrefix
не найдено в базе данных локального списка угроз, удалите его изexpressionHashPrefixes
.
- Найдите
- Отправьте
expressionHashPrefixes
на сервер Google Safe Browsing v5 с помощью RPC SearchHashes или метода REST hashes.search . Если произошла ошибка (включая сетевые ошибки, ошибки HTTP и т. д.), вернитеSAFE
. В противном случае, пусть ответом будетresponse
, полученный от сервера SB, который представляет собой список полных хэшей вместе с некоторой вспомогательной информацией, идентифицирующей характер угрозы (социальная инженерия, вредоносное ПО и т. д.), а такжеexpiration
действия кэша. - Для каждого
fullHash
response
:- Вставьте
fullHash
в локальный кеш вместе сexpiration
.
- Вставьте
- Для каждого
fullHash
response
:- Пусть
isFound
будет результатом поискаfullHash
вexpressionHashes
. - Если
isFound
имеет значение False, продолжите цикл. - Если
isFound
имеет значение True, вернитеUNSAFE
.
- Пусть
- Возврат
SAFE
.
Процедура проверки URL-адреса в реальном времени без локальной базы данных
Эта процедура используется, когда клиент выбирает режим работы в реальном времени без хранения.
Эта процедура принимает один URL-адрес u
и возвращает SAFE
или UNSAFE
.
- Пусть
expressions
представляют собой список выражений суффиксов/префиксов, сгенерированных URL-адресомu
. - Пусть
expressionHashes
будет списком, элементами которого являются хэши SHA256 каждого выражения вexpressions
. - Пусть
expressionHashPrefixes
будет списком, элементами которого являются первые 4 байта каждого хеша вexpressionHashes
. - Для каждого
expressionHashPrefix
изexpressionHashPrefixes
:- Найдите
expressionHashPrefix
в локальном кеше. - Если кэшированная запись найдена:
- Определите, превышает ли текущее время время его истечения.
- Если оно больше:
- Удалите найденную кэшированную запись из локального кэша.
- Продолжайте цикл.
- Если оно не больше:
- Удалите это конкретное
expressionHashPrefix
изexpressionHashPrefixes
. - Проверьте, найден ли соответствующий полный хэш внутри
expressionHashes
в кэшированной записи. - Если найдено, верните
UNSAFE
. - Если не найден, продолжите цикл.
- Удалите это конкретное
- Если кэшированная запись не найдена, продолжите цикл.
- Найдите
- Отправьте
expressionHashPrefixes
на сервер Google Safe Browsing v5 с помощью RPC SearchHashes или метода REST hashes.search . Если произошла ошибка (включая сетевые ошибки, ошибки HTTP и т. д.), вернитеSAFE
. В противном случае, пусть ответом будетresponse
, полученный от сервера SB, который представляет собой список полных хешей вместе с некоторой вспомогательной информацией, идентифицирующей характер угрозы (социальная инженерия, вредоносное ПО и т. д.), а такжеexpiration
действия кэша. - Для каждого
fullHash
response
:- Вставьте
fullHash
в локальный кеш вместе сexpiration
.
- Вставьте
- Для каждого
fullHash
response
:- Пусть
isFound
будет результатом поискаfullHash
вexpressionHashes
. - Если
isFound
имеет значение False, продолжите цикл. - Если
isFound
имеет значение True, вернитеUNSAFE
.
- Пусть
- Возврат
SAFE
.
Как и процедура проверки URL-адресов в реальном времени, эта процедура не определяет , как именно отправлять хэш-префиксы на сервер. Например, клиент может отправлять все expressionHashPrefixes
в одном запросе, а также допустимо, чтобы клиент отправлял каждый отдельный префикс в expressionHashPrefixes
на сервер в отдельных запросах (возможно, выполняемых параллельно). Клиенту также разрешено отправлять несвязанные или случайно сгенерированные хэш-префиксы вместе с хэш-префиксами в expressionHashPrefixes
, если количество хэш-префиксов, отправленных в одном запросе, не превышает 30.
Обслуживание локальной базы данных
Google Safe Browsing v5 предполагает, что клиент будет поддерживать локальную базу данных, за исключением случаев, когда клиент выбирает режим реального времени без хранения. Формат и хранение этой локальной базы данных зависит от клиента. Содержимое этой локальной базы данных концептуально можно рассматривать как папку, содержащую различные списки в виде файлов, а содержимое этих файлов представляет собой хэши SHA256 или хэш-префиксы.
Обновления базы данных
Клиент будет регулярно вызывать метод hashList.get или метод hashLists.batchGet для обновления базы данных. Поскольку типичный клиент захочет обновить несколько списков одновременно, рекомендуется использовать метод hashLists.batchGet .
Списки идентифицируются по своим отдельным именам. Имена представляют собой короткие строки ASCII длиной в несколько символов.
В отличие от версии 4, где списки идентифицируются по кортежу типа угрозы, типа платформы и типа записи угрозы, в версии 5 списки идентифицируются просто по имени. Это обеспечивает гибкость, когда несколько списков версии 5 могут использовать один и тот же тип угроз. Типы платформ и типы записей об угрозах удалены в версии 5.
После того, как имя было выбрано для списка, он никогда не будет переименован. Более того, если список появился, он никогда не будет удален (если список перестанет быть полезным, он станет пустым, но продолжит существовать). Поэтому целесообразно жестко запрограммировать эти имена в клиентском коде Google Safe Browsing.
И метод hashList.get , и метод hashLists.batchGet поддерживают инкрементные обновления. Использование дополнительных обновлений экономит полосу пропускания и повышает производительность. Инкрементные обновления работают путем предоставления разницы между версией списка клиента и последней версией списка. (Если клиент развернут недавно и у него нет доступных версий, доступно полное обновление.) Инкрементное обновление содержит индексы удаления и дополнения. Ожидается, что клиент сначала удалит записи по указанным индексам из своей локальной базы данных, а затем применит дополнения.
Наконец, чтобы предотвратить повреждение, клиент должен сверить сохраненные данные с контрольной суммой, предоставленной сервером. Если контрольная сумма не совпадает, клиент должен выполнить полное обновление.
Декодирование содержимого списка
Декодирование хешей и префиксов хешей
Все списки доставляются с использованием специальной кодировки для уменьшения размера. Эта кодировка работает, признавая, что списки безопасного просмотра Google концептуально содержат набор хэшей или хеш-префиксов, которые статистически неотличимы от случайных целых чисел. Если бы нам пришлось отсортировать эти целые числа и взять соседнюю разность, то ожидается, что такая смежная разница будет в некотором смысле «маленькой». Кодирование Голомба-Райса затем использует эту малость.
Предположим, что три выражения префикса пути суффикса хоста, а именно a.example.com/
, b.example.com/
и y.example.com/
, должны передаваться с использованием 4-байтовых хэш-префиксов. Далее предположим, что параметр Райса, обозначаемый k, выбран равным 30. Сервер начнет с вычисления полного хеша для этих строк, которые соответственно:
291bc5421f1cd54d99afcc55d166e2b9fe42447025895bf09dd41b2110a687dc a.example.com/
1d32c5084a360e58f1b87109637a6810acad97a861a7769e8f1841410d2a960c b.example.com/
f7a502e56e8b01c6dc242b35122683c9d25d07fb1f532d9853eb0ef3ff334f03 y.example.com/
Затем сервер формирует 4-байтовые префиксы хеша для каждого из вышеперечисленных, которые представляют собой первые 4 байта 32-байтового полного хэша, интерпретируемые как 32-битные целые числа с прямым порядком байтов. Большой порядок байтов относится к тому факту, что первый байт полного хеша становится самым значимым байтом 32-битного целого числа. Результатом этого шага являются целые числа 0x291bc542, 0x1d32c508 и 0xf7a502e5.
Серверу необходимо лексикографически отсортировать эти три хеш-префикса (эквивалентно числовой сортировке с прямым порядком байтов), и результатом сортировки будет 0x1d32c508, 0x291bc542, 0xf7a502e5. Первый префикс хеша сохраняется без изменений в поле first_value
.
Затем сервер вычисляет две соседние разницы: 0xbe9003a и 0xce893da3 соответственно. Учитывая, что k выбрано равным 30, сервер разбивает эти два числа на частную и остаточную части длиной 2 и 30 бит соответственно. Для первого числа частная часть равна нулю, а остаток равен 0xbe9003a; для второго числа частная часть равна 3, поскольку два старших бита равны 11 в двоичном формате, а остаток равен 0xe893da3. Для данного частного q
оно кодируется в (1 << q) - 1
используя ровно 1 + q
бит; остаток кодируется напрямую с использованием k бит. Частная часть первого числа кодируется как 0, а оставшаяся часть имеет двоичный код 001011111010010000000000111010; Частная часть второго числа кодируется как 0111, а оставшаяся часть — 001110100010010011110110100011.
Когда эти числа формируются в строку байтов, используется прямой порядок байтов. Концептуально может быть проще представить себе, как длинная цепочка битов формируется, начиная с младших битов: мы берем частную часть первого числа и добавляем к нему оставшуюся часть; затем мы добавляем частную часть второго числа и добавляем оставшуюся часть. В результате должно получиться следующее большое число (для ясности добавлены переносы строк и комментарии):
001110100010010011110110100011 # Second number, remainder part
0111 # Second number, quotient part
001011111010010000000000111010 # First number, remainder part
0 # First number, quotient part
Написанное в одну строку, это будет
00111010001001001111011010001101110010111110100100000000001110100
Очевидно, что это число намного превышает 8 бит, доступных в одном байте. Кодировка с прямым порядком байтов затем берет младшие 8 бит этого числа и выводит их как первый байт, который равен 01110100. Для ясности мы можем сгруппировать приведенную выше битовую строку в группы по восемь, начиная с младших битов:
0 01110100 01001001 11101101 00011011 10010111 11010010 00000000 01110100
Кодировка с прямым порядком байтов затем берет каждый байт справа и помещает его в строку байтов:
01110100
00000000
11010010
10010111
00011011
11101101
01001001
01110100
00000000
Можно видеть, что, поскольку мы концептуально добавляем новые части к большому числу слева (т. е. добавляем более значимые биты), но кодируем справа (т. е. наименее значимые биты), кодирование и декодирование могут выполняться постепенно.
В конечном итоге это приводит к
additions_four_bytes {
first_value: 489866504
rice_parameter: 30
entries_count: 2
encoded_data: "t\000\322\227\033\355It\000"
}
Клиент просто выполняет описанные выше шаги в обратном порядке, чтобы декодировать хэш-префиксы. В отличие от версии 4, нет необходимости выполнять замену байтов в конце, поскольку целые числа хеш-префикса интерпретируются как обратный порядок байтов.
Декодирование индексов удаления
Индексы удаления кодируются с использованием той же методики, что и выше, с использованием 32-битных целых чисел. Кодировка и декодирование индексов удаления не изменились между v4 и v5.
Доступные списки
Следующие списки рекомендуются для использования в v5alpha1:
Имя списка | Соответствующее перечисление ThreatType v4 | Описание |
---|---|---|
gc | Никто | Этот список представляет собой список глобального кэша. Это специальный список, используемый только в режиме реального времени. |
se | SOCIAL_ENGINEERING | Этот список содержит угрозы типа SOCIAL_ENGINEERING. |
mw | MALWARE | В этом списке содержатся угрозы типа ВРЕДОНОСНОЕ ПО для настольных платформ. |
uws | UNWANTED_SOFTWARE | В этом списке содержатся угрозы типа UNWANTED_SOFTWARE для настольных платформ. |
uwsa | UNWANTED_SOFTWARE | В этом списке содержатся угрозы типа UNWANTED_SOFTWARE для платформ Android. |
pha | POTENTIALLY_HARMFUL_APPLICATION | В этом списке содержатся угрозы типа POTENTIALLY_HARMFUL_APPLICATION для платформ Android. |
Дополнительные списки станут доступны позднее, когда приведенная выше таблица будет расширена.
Клиенту разрешено использовать кэширующий прокси-сервер для получения некоторых или всех приведенных выше списков, а затем заставить клиента связаться с прокси-сервером. Если это реализовано, мы рекомендуем короткую продолжительность кэширования, например пять минут; в будущем эта длительность кэша может передаваться с использованием стандартного HTTP-заголовка Cache-Control
.
Частота обновления
Клиент должен проверить возвращаемое сервером значение в поле minimum_wait_duration
и использовать его для планирования следующего обновления базы данных. Это значение, возможно, равно нулю (поле minimum_wait_duration
полностью отсутствует), и в этом случае клиент ДОЛЖЕН немедленно выполнить еще одно обновление.
Примеры запросов
В этом разделе описаны некоторые примеры прямого использования HTTP API для доступа к безопасному просмотру Google. Обычно рекомендуется использовать сгенерированную языковую привязку, поскольку она автоматически обрабатывает кодирование и декодирование удобным способом. Пожалуйста, обратитесь к документации по этой привязке.
Вот пример HTTP-запроса с использованием метода hashes.search :
GET https://safebrowsing.googleapis.com/v5/hashes:search?key=INSERT_YOUR_API_KEY_HERE&hashPrefixes=WwuJdQ
Тело ответа представляет собой полезную нагрузку в формате буфера протокола, которую вы затем можете декодировать.
Вот пример HTTP-запроса с использованием метода hashLists.batchGet :
GET https://safebrowsing.googleapis.com/v5alpha1/hashLists:batchGet?key=INSERT_YOUR_API_KEY_HERE&names=se&names=mw
Тело ответа снова представляет собой полезную нагрузку в формате буфера протокола, которую вы затем можете декодировать.
Руководство по миграции
Если вы в настоящее время используете API обновления версии 4 , существует простой путь перехода с версии 4 на версию 5 без необходимости сброса или удаления локальной базы данных. В этом разделе описано, как это сделать.
Преобразование обновлений списка
В версии 4 для загрузки списков можно было использовать метод ThreatListUpdates.fetch . В версии v5 можно было бы переключиться на метод hashLists.batchGet .
В запрос необходимо внести следующие изменения:
- Полностью удалите объект
ClientInfo
версии 4 . Вместо того, чтобы предоставлять идентификацию клиента с помощью выделенного поля, просто используйте известный заголовок User-Agent . Несмотря на то, что в этом заголовке нет предписанного формата для поставки идентификации клиента, мы предлагаем просто включить оригинальный идентификатор клиента и версию клиента, разделенную космическим символом или символом SLASH. - Для каждого объекта V4
ListUpdateRequest
:- Посмотрите соответствующее имя списка V5 в таблице выше и поставьте это имя в запросе V5.
- Удалите ненужные поля, такие как
threat_entry_type
илиplatform_type
. - Поле
state
в V4 напрямую совместимо с полемversions
V5. Та же самая строка, которая будет отправлена на сервер, используя полеstate
в V4, может быть просто отправлена в V5 с помощью поляversions
. - Для ограничений V4 V5 использует упрощенную версию под названием
SizeConstraints
. Дополнительные поля, такие какregion
должны быть сброшены.
Следующие изменения должны быть внесены в ответ:
- V4 enum
ResponseType
просто заменяется логическим полем с именемpartial_update
. - Поле
minimum_wait_duration
теперь может быть нулевым или опущено. Если это так, клиенту просят немедленно сделать другой запрос. Это происходит только тогда, когда клиент определяет вSizeConstraints
меньшее ограничение на размер обновления максимума, чем максимальный размер базы данных. - Алгоритм декодирования риса для 32-разрядных целых чисел должен быть скорректирован. Разница в том, что закодированные данные кодируются с другой эндзиазоном. Как в V4, так и в V5 32-разрядные хеш-префиксы сортируются лексикографически. Но в V4 эти префиксы рассматриваются как мало эндьяна при сортировке, тогда как в V5 эти префиксы рассматриваются как большой эндсиан при сортировке. Это означает, что клиенту не нужно делать никакой сортировки, поскольку лексикографическая сортировка идентична численной сортировке с большим эндианом. Пример такого рода в реализации хрома V4 можно найти здесь . Такая сортировка может быть удалена.
- Алгоритм декодирования риса должен быть реализован для других длины хэш.
Преобразование хэш -поисков
В V4 можно было бы использовать метод Fullhashes.find , чтобы получить полный хэши. Эквивалентным методом в V5 является метод HASHE.Search .
Следующие изменения должны быть внесены в запрос:
- Структура кода, чтобы отправить только хеш -префиксы длиной ровно 4 байта.
- Всего удалить объекты V4
ClientInfo
. Вместо того, чтобы поставлять идентификацию клиента, используя выделенное поле, просто используйте известный заголовок пользователя-агента . Несмотря на то, что в этом заголовке нет предписанного формата для поставки идентификации клиента, мы предлагаем просто включить оригинальный идентификатор клиента и версию клиента, разделенную космическим символом или символом SLASH. - Удалите поле
client_states
. В этом больше нет необходимости. - Больше не нужно включать
threat_types
и подобные поля.
Следующие изменения должны быть внесены в ответ:
- Поле
minimum_wait_duration
было удалено. Клиент всегда может выпустить новый запрос на необходимости. - Объект v4
ThreatMatch
был упрощен в объектFullHash
. - Кэширование было упрощено в одну продолжительность кэша. См. Приведенные выше процедуры для взаимодействия с кэшем.