Заголовок пользовательского агента - аббревиатура для хранения mysql

Согласно этой теме, и особенно этому сообщению: https://stackoverflow.com/a/6595973/1125465, Microsoft as всегда выпендривается. Размер пользовательского агента может быть действительно огромным.

Я работаю над небольшой библиотекой посетителей на php, и я хочу хранить информацию пользовательского агента. Я не могу определиться с типом данных и длиной.

Итак, мой вопрос: есть ли у вас идеи, как сократить пользовательский агент до "нормального" размера? (например, 256 символов).


Примечание. Разработчики используют пользовательские агенты для обнаружения браузера пользователя и операционных систем. Итак, согласно связанному примеру, все глупые числа из M $ просто ... Просто есть. Как всегда действует нам на нервы. Итак, идея состоит в том, чтобы сделать функцию, которая сокращает строку пользовательского агента, но не теряет важную информацию.

Я считаю, что такая функция должна:

  • Не зависит от будущих обновлений и новых браузеров (без жестко запрограммированных строк)
  • Имейте простой механизм, который решает, что удалять (например, если есть число, запятая, число, запятая, число, запятая, число, ..., он может удалить это, это не интересно).
  • И в конце, если все операции по-прежнему приводят к слишком длинному пользовательскому агенту (скажем, 256 символов), больше нечего делать, поэтому просто отключите остальные. Это один на миллион, поэтому данные могут быть потеряны.

Дополнительное примечание: Я знаю, что могу создать функцию, которая получает браузер и тип ОС из пользовательского агента и сохраняет только эти значения. Но, как всегда, такие функции имеют жестко запрограммированные имена, и если браузер не распознается, он, например, возвращает «Нераспознанный браузер». Так что в будущем все должны помнить об обновлении этих функций. И если мы сохраним сокращенный пользовательский агент, информация не будет не потеряно (поскольку только сценарий, который читает базу данных, должен иметь новую систему распознавания). Но записи в базе данных надежны и согласованы, как и должно быть.


ОБНОВЛЕНИЕ: так как должен быть какой-то код, и есть проблема с идеей, а не проблема с существующим кодом, я напишу минимальный код, который я написал до сих пор;):

<?php
    function shorten($useragent, $maxsize = 256) {
        $shorten = $useragent;
        ... // ?
        $shorten = substr($shorten, 0, $maxsize); // the "last hope" cut
        return $shorten;
    }
    echo shorten($_SERVER['HTTP_USER_AGENT']);
?>

person Jacek Kowalewski    schedule 19.05.2014    source источник
comment
Вы можете извлечь из него определенную информацию с помощью preg_replace() и просто сохранить то, что вам нужно.   -  person ThePixelPony    schedule 19.05.2014


Ответы (1)


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

User-Agent: <engine-string> <engine-string> ...

Где engine-string имеет форму:

<agent-name> (<comment>; <comment>; ...)

Каждая строка движка (я просто так ее назвал, насколько я понимаю, может быть неправильной) может иметь или не иметь комментариев.

Например:

Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) ↲
AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e ↲
Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)

(Это одна строка, я просто разбил ее на строки.) Кажется, всякий раз, когда кто-то выполняет форк движка браузера, они просто добавляют свою вещь в конец. Итак, у нас есть некий абстрактный браузер «Mozilla» (наследие «Первой войны браузеров»), который думает, что он на iPhone. Затем мы видим, что существует WebKit (который помнит, что некоторое время назад он родился как KHTML). Затем есть некоторая модификация Version / 6.0, которая затем была преобразована в Mobile / 10A5376e, которая стала Safari / 8536.25, что наконец раскрывает секрет того, что это на самом деле мобильный бот Google.

Другой пример:

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; GTB7.4; ↲
InfoPath.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.4506.2152; ↲
.NET CLR 3.5.30729; .NET CLR 1.1.4322)

Это единый движок, но в скобках он может многое сказать.

Итак, общее наблюдение:

  • последние струны двигателя самые важные,
  • последние комментарии в скобках менее важны.

Имея это в виду, моя идея состояла бы в том, чтобы проанализировать строку в этом движке и маркеры комментариев, а затем из каждого раздела движка выбросить комментарии, начиная, скажем, с пятого. Затем, если этого все еще недостаточно, выбросьте разделы движка, начиная со второго (первый часто представляет собой абстрактную «Mozilla», но часто содержит полезные комментарии; также иногда это действительно что-то конкретное, особенно для веб-сканеров).

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

person Gas Welder    schedule 20.06.2014
comment
Большое спасибо за ответ. Он единственный, но я совершенно уверен, что никто не будет раскрывать эту тему более широко. +1, принято. С уважением и очень признателен за вашу работу и знания. Спасибо! - person Jacek Kowalewski; 20.06.2014