URL и хэширование

Списки Safe Browsing состоят из префиксов хэшей SHA-256 произвольной длины (от 4 до 32 байт), которые соответствуют URL интернет-ресурсов, представляющих угрозу для пользователя. Чтобы проверить наличие URL в списке (в локальной базе или на сервере), вычислите префикс хэша. Для этого:

Пример реализации на языке Golang.

Выполните поиск по локальной базе списков Safe Browsing. Если префикс хэша найден, отправьте его в запросе.

Канонический вид URL

URL должен соответствовать стандарту RFC 2396. URL в интернационализированных доменных именах (IDN), например .рф, нужно конвертировать в ASCII методом Punycode. URL должен содержать компонент пути, то есть завершаться слешем: например, https://yandex.ru/.

Чтобы привести URL к каноническому виду:

  1. Удалите знаки табуляции 0x09 и перевода строки 0x0d и 0x0a.

  2. Удалите якорь. Например, https://yandex.ru/#anchor сократите до https://yandex.ru/.

  3. Отдельно обработайте:

    Хост
    • Удалите точки в начале и в конце.
    • Замените несколько последовательных точек на одну.
    • Если имя хоста — IP-адрес, приведите его в вид четырех десятичных чисел, разделенных точкой.
    • Приведите к нижнему регистру.
    Путь
    Примечание. Не применяйте эти действия к параметрам запроса.
    • Удалите последовательность символов /../ и замените /./ на /.
    • Замените несколько последовательных слешей на один.
  4. Экранируйте все ASCII-символы младше 32 и старше 127, а также # и %. Используйте шестнадцатеричную запись в верхнем регистре.
Пример
Исходный URL Канонический вид
http://host/%25%32%35
http://host/%25
http://host/%25%32%35%25%32%35
http://host/%25%25
http://host/%2525252525252525
http://host/%25
http://host/asdf%25%32%35asd
http://host/asdf%25asd
http://host/%%%25%32%35asd%%
http://host/%25%25%25asd%25%25
http://%32%31%33%2e%31%38%30%2e%32%31%30%2e5/%2e%73%65%63%75%72%65%2f%77%77%77%2e%6d%6f%69%6b%72%75%67%2e%72%75/
http://213.180.210.5/.secure/www.moikrug.ru/
http://host%23.com/%257Ea%2521b%2540c%2523d%2524e%25f%255E00%252611%252A22%252833%252944_55%252B
http://host%23.com/~a!b@c%23d$e%25f^00&11*22(33)44_55+
http://3279880203/smth
http://195.127.0.11/smth
http://www.yandex.ru/smth/..
http://www.yandex.ru/
www.yandex.ru
http://www.yandex.ru/
http://www.zlo.com/smth#ancor
http://www.zlo.com/smth
http://www.YANdex.ru/
http://www.yandex.ru/
http://www.yandex.ru.../
http://www.yandex.ru/
http://www.yandex.ru/m\ta\rp\ns
http://www.yandex.ru/maps
http://zlo.com/smth#more#again
http://zlo.com/smth
http://\x01\x80.com/
http://%01%80.com/
http://www.hostport.com:1234/
http://www.hostport.com/
  http://www.yandex.ru/  
http://www.yandex.ru/
http:// probel.ru/
http://%20probel.ru/
http://host.com//dvaslesha?more//slashes
http://host.com/dvaslesha?more//slashes
Исходный URL Канонический вид
http://host/%25%32%35
http://host/%25
http://host/%25%32%35%25%32%35
http://host/%25%25
http://host/%2525252525252525
http://host/%25
http://host/asdf%25%32%35asd
http://host/asdf%25asd
http://host/%%%25%32%35asd%%
http://host/%25%25%25asd%25%25
http://%32%31%33%2e%31%38%30%2e%32%31%30%2e5/%2e%73%65%63%75%72%65%2f%77%77%77%2e%6d%6f%69%6b%72%75%67%2e%72%75/
http://213.180.210.5/.secure/www.moikrug.ru/
http://host%23.com/%257Ea%2521b%2540c%2523d%2524e%25f%255E00%252611%252A22%252833%252944_55%252B
http://host%23.com/~a!b@c%23d$e%25f^00&11*22(33)44_55+
http://3279880203/smth
http://195.127.0.11/smth
http://www.yandex.ru/smth/..
http://www.yandex.ru/
www.yandex.ru
http://www.yandex.ru/
http://www.zlo.com/smth#ancor
http://www.zlo.com/smth
http://www.YANdex.ru/
http://www.yandex.ru/
http://www.yandex.ru.../
http://www.yandex.ru/
http://www.yandex.ru/m\ta\rp\ns
http://www.yandex.ru/maps
http://zlo.com/smth#more#again
http://zlo.com/smth
http://\x01\x80.com/
http://%01%80.com/
http://www.hostport.com:1234/
http://www.hostport.com/
  http://www.yandex.ru/  
http://www.yandex.ru/
http:// probel.ru/
http://%20probel.ru/
http://host.com//dvaslesha?more//slashes
http://host.com/dvaslesha?more//slashes

Выражения для хоста и пути

После того как URL приведен к канонической форме, создайте:
  1. Выражения для хоста и пути.
  2. Комбинации этих выражений.
Выражения для хоста
Сформируйте не более 5 различных строк:
  • Полное имя хоста.
  • До 4 имен хоста, начиная с последних пяти компонент и последовательно удаляя первую компоненту. Домен верхнего уровня можно пропустить. Эти строки не нужно создавать, если имя хоста — IP-адрес.
Выражения для пути
Сформируйте не более 6 различных строк:
  • Полный путь с параметрами запроса.
  • Полный путь без параметров запроса.
  • 4 пути, начиная с корня и последовательно добавляя компонент пути с закрывающим слешем.
Комбинации

Сформируйте до 30 различных комбинаций выражений для хоста и пути. Эти комбинации должны включать только имя хоста и путь; схема (протокол), имя пользователя, пароль и порт нужно исключить. Если в URL есть параметры запроса, по крайней мере одна комбинация должна содержать полный путь и параметры запроса.

Пример
Для URL http://a.b.c/1/2.html?param=1 нужно сформировать следующие строки:
a.b.c/1/2.html?param=1
a.b.c/1/2.html
a.b.c/
a.b.c/1/
b.c/1/2.html?param=1
b.c/1/2.html
b.c/
b.c/1/ 

Для URL http://a.b.c.d.e.f.g/1.html нужно сформировать следующие строки:

a.b.c.d.e.f.g/1.html
a.b.c.d.e.f.g/
(Вариант b.c.d.e.f.g нужно пропустить, потому что используются только последние пять компонент имени хоста и полное имя хоста)
c.d.e.f.g/1.html
c.d.e.f.g/
d.e.f.g/1.html
d.e.f.g/
e.f.g/1.html
e.f.g/
f.g/1.html
f.g/

Для URL http://1.2.3.4/1/ нужно сформировать следующие строки:

1.2.3.4/1/
1.2.3.4/

Хэши

После того, как комбинации из выражений для хоста и пути сформированы, вычислите для каждой из них хэш SHA256 полной длины.

Затем вычислите префикс для каждого хэша полной длины. Префикс хэша состоит из 4–32 байт.

Примеры из стандарта FIPS-180-4:

Хэш для строки abc
  • Значение хэш-функции ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad.
  • 32-битный префикс ba7816bf.
Хэш для строки abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq
  • Значение хэш-функции ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad.
  • 48-битный префикс 248d6a61 d206.