Проверка игровых серверов

Введение

Это сервис, предназначенный для проверки игровых серверов GoldSrc (HLDS), в частности Counter Strike 1.6, на предмет наличия команд, негативно влияющих на клиент игры.

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

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

Для чего нужна защита мастерсервера?

Различные игровые сервера могут содержать вредоносные плагины, предназначенные для раскрутки серверов запрещенными методами. К таким командам относятся, в том числе, автоконнект, бинды спама и коннекта на кнопки, перенаправление игрока на другой сервер (редирект), "подмена" (замена адреса Мастер-Сервера).

Эти плагины могут быть установлены на сервере администратором сознательно для раскрутки этого сервера, либо вредоносные функции были включены в один из безобидных плагинов. Вследствие выполнения этих команд на клиенте, Вы как владелец сервиса раскрутки, в конечном итоге теряете игрока. В случае автоконнекта или бинда коннекта на кнопки игроку надоедает автоматическое подключение на какой-то, как правило, румынский сервак и он удаляет КС и скачивает Counter Strike 1.6 в другом месте. Если это замена МС - игрок ничего не заметит, но вы уде потеряли "уник".

Структура документа

Ограничения и требования

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

Общий формат запросов

Запрос осуществляется с использованием HTTP протокола на адрес http://api.cs-best.org.ua/query.php. Обязательные параметры, передаваемые методом GET:

ПараметрВозможные значения
kВаш личный ключ API длиной 32 знака [0-9a-f]. На этапе бесплатного тестирования сервиса можете пользоваться ключем 8770980dda0d333b96f31668ab60b636
mВызываемый метод API (см. далее)
fФормат ответа: json либо text

Метод balance

Для проверки количества запросов, доступных Вам, можно использовать метод balance. Сервер возвращает значение в поле balance. Значением является целое положительное число либо 0, если Вы использовали доступный лимит.

Пример запроса:
http://api.cs-best.org.ua/query.php?k=8770980dda0d333b96f31668ab60b636&m=balance&f=json
Пример ответа:
{"balance":"31415"}

Метод srvinfo

Для проверки серверов на предмет отправки вредоносных команд, можно использовать метод srvinfo. Информация о сервере получается путем захода бота на этот сервер (не в реальном времени). Проверяются все сервера, когда-либо видимые нашей экспертной системой, но частота проверки может сильно отличаться и зависит от многих факторов включая то находится ли данный сервер в "приоритетных" мастерсерверах или нет. Помимо обязательных параметров, передаваемых методом GET, Вы должны передать список серверов для проверки в параметре servers методом POST. Параметр должен содержать не меньше 1 и не больше 100 серверов в 1 запросе. Список может содержать либо IP:PORT серверов с разделителем - переводом строки (как \n так и \r\n), так и JSON массив с целочисленными полями.

Сервис возвращает массив srvinfo, элементами которого являются структуры с информацией об указанных серерах. При этом, если Вы передавали список серверов с разделителем-переводом строки, то индексы серверов в массиве будут совпадать с порядковыми номерами (начиная с 0). Если же параметр servers содержал JSON массив - будут взяты индексы из него. В случае отсутствия информации о сервере, соответствующим ему элементом массива будет не структура, а строка SERVER_NOT_FOUND

Поля, возвращаемые в структуре данных:

ПараметрОписаниеПример
firstВремя первого обнаружения указанного сервера в каком-либо из известных нам мастерсерверов07.11.2013
lastВремя последнего обнаружения указанного сервера26.01.2015
checkДата последней проверки сервера нашим кластером проверяющих ботов. Вся перечисленная ниже информация предоставлена по состоянию на эту дату.26.03.2015
hostnameИмя сервера в момент проверкиCool 18+ CS 1.6 Server 24/7
botsКоличество ботов, игравших на сервере в момент проверки. Если количество ботов превышает половину от maxplayers - как правило, это фейк-сервер.5
pingПинг (мс) в момент проверки. Может принимать различные значения, в частности высокие, в случае если проверка европейского сервера проходила с сервера расположенного на Дальнем Востоке.30
allowКому разрешено подключение к серверу:
  • STEAM_ONLY - сервер пускает только Steam игроков. Смело удаляйте его из мастерсервера, т.к. скорее всего Ваши игроки не смогут к нему подключиться.
  • P48_ONLY - сервер разрешает подключение только с клиентов, поддерживающих 48й протокол. 47й протокол был заблокирован администрацией в DPROTO либо плагин DPROTO отсутствует.
  • ALL - сервер разрешает подключение всем игрокам
  • FAILED - нам не удалось подключиться к серверу. Возможно, из-за его заполненности.
  • ERROR - данные о сервере не обнаружены. Возможно, сервер никогда не проверялся нашей системой. Попробуйте повторить запрос через день. В случае, если параметр first говорит, что сервер нам известен, а last является актуальным, а не датой из далекого прошлого - вероятно, мы не смогли не только подключиться, но и получить информацию о сервере.
STEAM_ONLY
buildБилд сервера5787
resources

Массив не стандартных ресурсов, которые загружаются с сервера на клиент. Учтите, что приводится весь список файлов, изменение которых теоретически может испортить клиент. Мі предоставляем Вам самостоятельно анализировать его и принимать решения. Например, при обнаружении загрузки TrackerUI.DLL сервер может улетать в бан безоговорочно, а изменение GameMenu.res запрещают не все.

По каждому ресурсу приводятся поля:

  • name - имя файла относительно каталога игры (для CS 1.6 это cstrike, для Half-Life каталог Valve).
  • size - размер файла в байтах.
  • type - тип файла: 0 для звука, 2 для моделей и спрайтов, 3 для текстур, 4 для различных ресурсов, 5 для скриптов.

[0] => Array
	(
		[name] => bin/TrackerUI.DLL
		[type] => 4
		[size] => 128245
	)
[1] => Array
	(
		[name] => resource/GameMenu.res
		[type] => 4
		[size] => 1000
	)
[2] => Array
	(
		[name] => maps/de_dust2_2x2.res
		[type] => 4
		[size] => 100
	)
redirectsМассив строк - команд, которые сервер отправил клиенту с целью его перенаправления на другой сервер["wait;wait;wait;wait;wait;"connect"cs.traficzone.com:27015"]
commandsМассив строк - потенциально опасных команд, которые сервер отправил клиенту. Такими командами может быть, в частности, изменение биндов, рейтов и т.д. Не все из них обязательно вредоносные.["cl_updaterate 66","cl_cmdrate 66","bind \"n\" \"say \/shop\""]
Пример запроса:
POST /query.php?k=[KEY]&m=srvinfo&f=text HTTP/1.0 Host: api.cs-best.org.ua Content-Length: 128 servers=127.0.0.1:27015\r\n127.0.0.1:27016\r\n127.0.0.1:27017\r\n127.0.0.1:27018
Пример ответа:
Array
(
    [srvinfo] => Array
        (
            [0] => Array
                (
                    [first] => 07.11.2013
                    [last] => 25.04.2015
                    [check] => 26.03.2015
                    [hostname] => Counter Strike 1.6 Server
                    [bots] => 5
                    [ping] => 33
                    [allow] => ALL
                    [build] => 5787
                    [resources] => Array
                        (
                            [0] => Array
                                (
                                    [name] => bin/TrackerUI.DLL
                                    [type] => 4
                                    [size] => 128000
                                )
                        )
                )
            [1] => Array
                (
                    [first] => 08.09.2014
                    [last] => 25.04.2015
                    [check] => 26.03.2015
                    [hostname] => Counter Strike 1.6 Server
                    [bots] => 1
                    [ping] => 155
                    [allow] => ALL
                    [build] => 5787
                    [resources] => Array
                        (
                            [0] => Array
                                (
                                    [name] => resource/GameMenu.res
                                    [type] => 4
                                    [size] => 1007
                                )
                        )
                )
            [2] => Array
                (
                    [first] => 08.09.2014
                    [last] => 25.04.2015
                    [check] => 26.03.2015
                    [hostname] => Counter Strike 1.6 CSDM
                    [bots] => 5
                    [ping] => 237
                    [allow] => ALL
                    [build] => 6027
                )
            [3] => "SERVER_NOT_FOUND"
        )
)

Метод srvstat

При добавлении сервера в свой мониторинг хотелось бы знать, посылает ли этот сервер вредоносные команды игрокам. Ранее для этого использовали метод srvinfo, однако, сейчас более надежной является проверка по базе данных нашего логгера. Помимо обязательных параметров, вы передаете список серверов абсолютно аналогично методу srvinfo для проверки в параметре servers методом POST. Параметр должен содержать не меньше 1 и не больше 1000 серверов в 1 запросе. Список может содержать как IP:PORT серверов с разделителем - переводом строки (как \n так и \r\n), так и JSON массив с целочисленными полями.

Сервис возвращает массив srvstat, элементами которого являются структуры с информацией об указанных серерах. При этом, если Вы передавали список серверов с разделителем-переводом строки, то индексы серверов в массиве будут совпадать с порядковыми номерами (начиная с 0). Если же параметр servers содержал JSON массив - будут взяты индексы из него. В случае отсутствия информации о сервере, соответствующим ему элементом массива будет не структура, а строка SERVER_NOT_FOUND

Поля, возвращаемые в структуре данных:

ПараметрОписаниеПример
firstВремя первого обнаружения указанного сервера в каком-либо из известных нам мастерсерверов07.11.2013
lastВремя последнего обнаружения указанного сервера26.01.2015
totalКоличество команд, посланных серверу всем игрокам с нашим протектором (суммарно).11222
badcmdКоличество команд из тех что выше, распознанных нашими фильтрами как плохие111

Учтите, что нулевое значение badcmd само по себе не гарантирует того что сервер не посылает "плохие" команды! Может быть, в системе просто нет информации о сервере. Таким образом, Ваш скрипт должен рассматривать три ситуации:

Пример запроса:
POST /query.php?k=[KEY]&m=srvstat&f=text HTTP/1.0 Host: api.cs-best.org.ua Content-Length: 128 servers=127.0.0.1:27016\r\n127.0.0.1:27017\r\n127.0.0.1:27018
Пример ответа:
Array
(
    [balance] => 540558
    [srvstat] => Array
        (
            [0] => Array
                (
                    [first] => 08.09.2014
                    [last] => 11.05.2017
                    [total] => 10269
                    [badcmd] => 3448
                )

            [1] => Array
                (
                    [first] => 07.11.2013
                    [last] => 11.05.2017
                    [total] => 1027
                    [badcmd] => 0
                )

            [2] => Array
                (
                    [first] => 15.03.2014
                    [last] => 11.05.2017
                    [total] => 0
                    [badcmd] => 0
                )
        )
)

Метод cmdlist

Метод srvstat предоставляет исключительно статистическую информацию о сервере - количество обработанных команд и количество распознанных как плохие. Если требуется проанализировать сервер с ненулевым значением badcmd, полученным методом srvstat, либо сразу собственноручно анализировать все подозрительные команды от этого сервера при его добавлении в мониторинг или при плановой проверке, если Вы используете наш протектор, целесообразно использовать именно этот метод.

Вы передаете список серверов абсолютно аналогично методу srvinfo и srvstat для проверки в параметре servers методом POST. Кроме того, можно использовать GET параметр since (тип - UNIX TIMESTAMP, например, функция time() на php) который ограничивает поиск данными более свежими чем указанное время. Период не может быть больше 15 суток, равно как и при отсутствии данного параметра устанавливается это значение.

Сервис возвращает массив cmdlog, элементами которого являются структуры с информацией об указанных серерах. Информацию об индексах см. в предыдущих методах. В случае отсутствия информации о сервере, соответствующим ему элементом массива будет не структура, а строка SERVER_NOT_FOUND. Каждая структура будет содержать поля first, last, total, badcmd (описание см. выше). Кроме того, данный метод возвращает еще одно поле этой структуры - массив cmdlist. Элементами массива являются структуры со следующими полями:

ПараметрОписаниеПример
msgСообщение, посланное игрокуSVC_STUFFTEXT
dataСобственно команда, может содержать переводы строки, разделители ; и другие спецсимволыMotd_write Connect cs2.cs-best.org.ua:27015
numКоличество команд, посланных за время от since до момента запроса.24

Команды расположены в порядке убывания числа повторений (num). Поле MSG может принимать следующее значение:

Таким образом, пройдя по массиву cmdlist и проанализировав каждую уникальную команду, можно сделать вывод о допустимости добавления этого сервера в ваш мониторинг.

Пример запроса:
POST /query.php?k=[KEY]&m=cmdlist&f=text HTTP/1.0 Host: api.cs-best.org.ua Content-Length: 128 servers=127.0.0.1:27016\r\n127.0.0.1:27017
Пример ответа:
Array
(
    [balance] => 540558
    [cmdlog] => Array
        (
            [0] => Array
                (
                    [first] => 08.09.2014
                    [last] => 11.05.2017
                    [total] => 10269
                    [badcmd] => 3448
                    [cmdlist] => Array
                        (
                        )

                )
            [1] => Array
                (
                    [first] => 15.03.2014
                    [last] => 11.05.2017
                    [total] => 2956
                    [badcmd] => 418
                    [cmdlist] => Array
                        (
                            [0] => Array
                                (
                                    [msg] => SVC_STUFFTEXT
                                    [data] => Motd_write Connect cs2.cs-best.org.ua:27015
                                    [num] => 24
                                )
                            [1] => Array
                                (
                                    [msg] => SVC_STUFFTEXT
                                    [data] => CoNNect cs2.cs-best.org.ua:27015
                                    [num] => 23
                                )
                            [2] => Array
                                (
                                    [msg] => SVC_STUFFTEXT
                                    [data] => Motdfile "valve.rc "
                                    [num] => 8
                                )
                            [3] => Array
                                (
                                    [msg] => SVC_STUFFTEXT
                                    [data] => Motdfile "autoexec.CFG"
                                    [num] => 8
                                )
                            [4] => Array
                                (
                                    [msg] => SVC_STUFFTEXT
                                    [data] => Motdfile "!MD5/../../platform/config/MasterServers.vdf"
                                    [num] => 8
                                )
                        )
                )
        )
)

Заключение

Первое время пользование системой бесплатно. В дальнейшем будет введена предоплата на определенное количество запросов.

Для интеграции необходимы базовые знания php и MySQL либо других технологий, на которых реализован Ваш сервис раскрутки.

Это API претендует на роль первого и единственного открытого API по борьбе с херовыми серверами, причем не только CS 1.6, но и любых игр на движке GoldSrc. Чем наша реализация лучше других? Найдите аналог и напишите нам. Был когда-то классный сервис log.cs-exes.ru, но он давно не актуален. Мы предоставляем данные как со "стучалки" из протектора, так и с ботов, которые периодически заходят на все существующие в мире сервера.

Данный хелп переработан и дополнен в мае 2017 года (в API появились новые методы).

Все вопросы и предложения присылайте на admin (собака) cs-best.org.ua