DevGang
Авторизоваться

Определить, является ли User-Agent подделанным

User-Agent использует определенную строку для идентификации информации о веб-клиенте, а User-Agent часто используется веб-сайтами для оценки платформы, обнаружения сканера и т.д. В этой статье представлены некоторые общие методы определения того, является ли User-Agent поддельным или нет.

1. Формат User-Agent

User-Agent — это стандартное поле заголовка, когда веб-клиент инициирует HTTP-запрос, который использует определенную строку для идентификации информации веб-клиента. User-Agent настолько важен, что веб-сайты часто используют его для определения платформы, обнаружения поисковых роботов и так далее.

Подавляющее большинство веб-браузеров используют следующий формат значения User-Agent:


Mozilla/[version] ([system and browser information]) [platform] ([platform details]) [extensions]

Ниже приведены значения User-Agent для типичного браузера FireFox:


Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/113.0

Среди них:

  • Mozilla/5.0

Mozilla/5.0 — это общий префикс, указывающий на совместимость с Mozilla, что является почти стандартным для современных веб-браузеров. Это сложное историческое происхождение.

  • Macintosh; Intel Mac OS X 10.15; rv:109.0

Идентифицирует информацию об операционной системе, в которой работает браузер.

  • Gecko/20100101

Информация о механизме рендеринга, используемом браузером.

  • Firefox/113.0

Информация о конкретном браузере (версия).

По сложным историческим причинам эволюции User-Agent основных браузеров часто представляет собой вариант вышеуказанного формата. Вот значения User-Agent различных браузеров, которые я действительно тестировал:

  • macOS Chrome

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36
  • macOS Safari

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.2 Safari/605.1.15
  • macOS Microsoft Edge

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/113.0.0.0 Safari/537.36 Edg/113.0.1774.50
  • iPhone Safari

Mozilla/5.0 (iPhone; CPU iPhone OS 15_7_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/15.6.4 Mobile/15E148 Safari/604.1
  • Android Chrome

Mozilla/5.0 (Linux; Android 7.1.2; Pixel) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.5060.71 Mobile Safari/537.36

2. Определение, является ли клиентский User-Agent подделанным

Информация User-Agent очень важна, но поскольку это простая для чтения строка в виде обычного текста, ее легко подделать. Для хорошо спроектированного веб-краулера он может подделать User-Agent любой системы и любой версии браузера, чтобы имитировать обычные запросы пользователя на доступ; большое количество запросов сканера вызовет большую нагрузку на системные службы, и легко сканировать большой объем конфиденциальных данных, чтобы решить эту проблему, в дополнение к ограничениям на частоту доступа и ненормальное поведение, вы также можете определить, является ли User-Agent был сфальсифицирован, чтобы различать запросы. Агент подделывается или не отличает запросы от вредоносных.

Обычный способ суждения состоит в том, чтобы собрать больше информации для сравнения со значением User-Agent, и когда есть несоответствие, это расценивается как подделка.

Дактилоскопия TCP/IP

HTTP использует TCP/IP в качестве базового транспортного протокола. Учитывая различия в реализации TCP в разных операционных системах и версиях операционных систем, можно использовать такую информацию, как заголовки и флаги TCP, для определения конкретной операционной системы. Если информация об отпечатке TCP определяет, что она принадлежит системе Linux, маловероятно, что пользовательский агент запроса будет системой Windows.

p0f — это инструмент для исследования, основанный на анализе информации о протоколе TCP/IP. Он может идентифицировать операционную систему, используемую хостом, перехватывая и анализируя пакеты, отправленные целевым хостом. Типичный пример результата сниффинга показан ниже.

.-[ 1.2.3.4/1524 -> 4.3.2.1/80 (syn) ]-
|
| client   = 1.2.3.4
| os       = Windows XP
| dist     = 8
| params   = none
| raw_sig  = 4:120+8:0:1452:65535,0:mss,nop,nop,sok:df,id+:0
|
`----

.-[ 1.2.3.4/1524 -> 4.3.2.1/80 (mtu) ]-
|
| client   = 1.2.3.4
| link     = DSL
| raw_mtu  = 1492
|
`----

.-[ 1.2.3.4/1524 -> 4.3.2.1/80 (uptime) ]-
|
| client   = 1.2.3.4
| uptime   = 0 days 11 hrs 16 min (modulo 198 days)
| raw_freq = 250.00 Hz
|
|
`----

.-[ 1.2.3.4/1524 -> 4.3.2.1/80 (http request) ]-
|
| client   = 1.2.3.4/1524
| app      = Firefox 5.x or newer
| lang     = English
| params   = none
| raw_sig  = 1:Host,User-Agent,Accept=[text/html,application/xhtml+xml...
|
`----

HTTP-информация

Помимо User-Agent, в заголовке HTTP-запроса есть много полей. Ниже приведена полная информация заголовка при запросе домашней страницы этого блога с помощью браузера FireFox.

GET / HTTP/2
Host: www.sobyte.net
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0) Gecko/20100101 Firefox/113.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Referer: https://www.sobyte.net/
Connection: keep-alive
Cookie: ...
Upgrade-Insecure-Requests: 1
Sec-Fetch-Dest: document
Sec-Fetch-Mode: navigate
Sec-Fetch-Site: same-origin
Sec-Fetch-User: ?1
TE: trailers

Если вы запустите тот же запрос в Chrome, вы увидите, что есть еще несколько заголовков.

Sec-Ch-Ua: "Google Chrome";v="113", "Chromium";v="113", "Not-A.Brand";v="24"
Sec-Ch-Ua-Mobile: ?0
Sec-Ch-Ua-Platform: "macOS"

Мало того, его содержимое полей Accept, Accept-Language и FireFox также имеют различия.


Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7

Кроме того, порядок заголовков некоторых запросов отличается между ними. В Firefox пользовательский агент находится вверху, а в Chrome — внизу.

Возможности JavaScript

Свойство window.navigator

Структуру window.navigator можно отличить по таким свойствам, как поставщик, платформа, oscpu и т. д., в дополнение к свойству userAgent.

  • Chorme
window.navigator.vendor -> Google Inc.
window.navigator.platform -> MacIntel
window.navigator.oscpu ->
  • FireFox
window.navigator.vendor ->
window.navigator.platform -> MacIntel
window.navigator.oscpu -> Intel Mac OS X 10.15
  • Safari
window.navigator.vendor: Apple Computer, Inc.
window.navigator.platform: MacIntel
window.navigator.oscpu: undefined

CSS-функции

Браузеры обычно имеют свои собственные нестандартные функции CSS. Мы можем использовать JS-метод CSS.supports, чтобы проверить, поддерживается ли данная функция CSS. Например:

  • Chrome
CSS.supports("-webkit-border-vertical-spacing", 0) -> true
CSS.supports("-moz-user-focus", "normal") -> false
CSS.supports("-moz-box-sizing", "content-box") -> false
  • Firefox
CSS.supports("-webkit-border-vertical-spacing", 0) -> false
CSS.supports("-moz-user-focus", "normal") -> true
CSS.supports("-moz-box-sizing", "content-box") -> true

Особые свойства window

Разные браузеры могут добавлять разные свойства окна.

  • Chrome
window.webkitCancelAnimationFrame !== undefined -> true
window.mozInnerScreenX !== undefined -> false
window.chrome !== undefined -> true
  • Firefox
window.webkitCancelAnimationFrame !== undefined -> false
window.mozInnerScreenX !== undefined -> true
window.chrome !== undefined -> false

Ограничения традиционных методов контроля

Вышеупомянутый метод проверки можно сравнить с информацией об User-Agent, чтобы определить, является ли он поддельным или нет. Но в то же время мы можем обнаружить проблему в том, что информация, которая может быть использована для дифференциации, принципиально не отличается от User-Agent, это четкая строка открытого текста, и злоумышленник также может произвольно изменить ее, чтобы подделать запрос, идентичный обычный пользователь. Другими словами, даже если мы сможем найти достаточно отличительной информации, злоумышленник может легко изменить значение этой информации, как если бы это был пользовательский агент.

Источник:

#Golang
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу