Когда клиенты выбирают использование Google Safe Browsing v5 в режиме реального времени, они хранят в своей локальной базе данных: (i) глобальный кэш с вероятно безопасными сайтами, отформатированный в виде хешей SHA256 выражений URL-адресов с суффиксом хоста/префиксом пути, (ii) набор списков угроз, отформатированный в виде префиксов хешей SHA256 выражений URL-адресов с суффиксом хоста/префиксом пути. Основная идея заключается в том, что всякий раз, когда клиент хочет проверить определенный URL-адрес, выполняется локальная проверка с использованием глобального кэша. Если эта проверка проходит успешно, выполняется локальная проверка списков угроз. В противном случае клиент продолжает проверку хешей в режиме реального времени, как описано ниже.
Помимо локальной базы данных, клиент будет поддерживать локальный кэш. Такой локальный кэш не обязательно должен храниться в постоянном хранилище и может быть очищен в случае нехватки памяти.
Подробное описание процедуры приведено ниже.
Процедура проверки URL-адреса в режиме реального времени
Эта процедура принимает один URL-адрес u и возвращает SAFE , UNSAFE или UNSURE . Если возвращается SAFE URL-адрес считается безопасным согласно Google Safe Browsing. Если возвращается UNSAFE URL-адрес считается потенциально небезопасным согласно Google Safe Browsing, и следует предпринять соответствующие действия: например, показать предупреждение конечному пользователю, переместить полученное сообщение в папку «Спам» или потребовать от пользователя дополнительного подтверждения перед продолжением. Если возвращается 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 будетresponse, полученным от сервера SB, который представляет собой список полных хешей вместе с некоторой вспомогательной информацией, определяющей характер угрозы (социальная инженерия, вредоносное ПО и т. д.), а также время истечения срока действия кэшаexpiration. - Для каждого
fullHashresponse:- Вставить
fullHashв локальный кэш вместе сexpiration.
- Вставить
- Для каждого
fullHashresponse:- Пусть
isFound— результат поискаfullHashвexpressionHashes. - Если
isFoundравно False, продолжайте цикл. - Если
isFoundравно True, вернутьUNSAFE.
- Пусть
- Верните
SAFE.
Хотя данный протокол определяет, когда клиент отправляет expressionHashPrefixes на сервер, он намеренно не указывает точно, как именно это делать. Например, клиенту допустимо отправлять все expressionHashPrefixes в одном запросе, а также отправлять каждый отдельный префикс из expressionHashPrefixes на сервер в отдельных запросах (возможно, параллельно). Также допустимо отправлять несвязанные или случайно сгенерированные хеш-префиксы вместе с хеш-префиксами из expressionHashPrefixes , при условии, что количество хеш-префиксов, отправляемых в одном запросе, не превышает 30.