Рекорды на стороне сервера для игры, написанной на Javascript - PullRequest
6 голосов
/ 19 февраля 2010

Я реализую простую игру на Javascript, и мне интересно иметь для нее онлайн-таблицу рекордов, чтобы игроки могли соревноваться друг с другом. У меня есть две проблемы по этому поводу:

  1. Какая простейшая серверная программа мне нужна для этой цели? Мне не нужно полноценное «веб-приложение», просто что-то простое, которое получает POST-запросы с рекордами, обновляет базу данных и отправляет списки результатов. Я знаком с Джанго. Каковы ваши предложения?
  2. Как сделать таблицу рекордов достаточно безопасной? Я знаю, что сделать его пуленепробиваемым против компетентных и преданных хакеров сложно, но я бы не хотел, чтобы кто-либо, имеющий доступ к исходному коду Javascript, мог слишком просто отправлять фиктивные оценки. Какие-нибудь инструменты для этой цели?

Ответы [ 7 ]

5 голосов
/ 19 февраля 2010

Будет довольно сложно добиться высоких результатов. Я имею в виду, что этого недостаточно для того, чтобы убедиться, что он поступает с вашей страницы, потому что, если, скажем, функция JavaScript submitHighScore(n), тогда они всегда могут набрать javascript: submitHighScore (10000000) в адресной строке на этой странице и заставить ее работать.

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

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

Имейте в виду, что действительно решительные люди всегда могут просто отследить данные, отправляемые на ваши данные, и декомпилировать их.

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

2 голосов
/ 14 декабря 2010

Чтобы безопасно отправить счет, подпишите его (вам также необходимо убедиться, что счет не был подделан до его подписания и отправки, но это еще одна проблема).

Скрыть секрет в коде JS,и отправьте highscore + hash(highscore + secret) на сервер.Хеш может быть MD5 / SHA1 - реализации JS легко найти.

Конечно, никто не выдержит тщательного анализа кода JS, но, по крайней мере, кто-то не сможет просто подать поддельный рекордвмешиваясь в HTTP-трафик.

При сокрытии вещей в JS:

Вы не можете действительно скрыть это (это, в конечном счете, бесполезно, как DRM), но вы можете сильно постаратьсячтобы запутать его и сделать отладку болезненной.

  1. Не помещайте секрет в качестве литерала в исходном коде - вычисляйте его во время выполнения, комбинируя результаты нескольких функций, локальных и глобальных переменных.
  2. Сократите весь код, удалите исходные карты.
  3. Добавьте фрагменты кода, которые ничего не делают, но, кажется, важны, чтобы сделать отладку более запутанной.
  4. Не делайтене помещайте ничего в глобальную область видимости, но полагайтесь на совместно изменяемое состояние, передавая замыкания и массивы.
  5. Полагайтесь на Date и таймеры, чтобы условия гонки заставляли ваш код давать неправильные результаты, если он был приостановлен вотладчик (только не делайте его слишком тугим, чтобы он мог работать на медленных машинах).

Если игра детерминированная (например, игра-головоломка), то пользователи могут отправить рекорд вформа журнала шагов, предпринятых для победы (пользовательский ввод), которые вы должны воспроизвести на сервере для подсчета очков.

Это изменит атаку с поиска / эмуляции функции отправки счета на умный ИИ или взломаСама игра, чтобы было легче играть (но все же в рамках ее основных правил).

1 голос
/ 16 ноября 2013

Я думаю об этом сам. Что кажется мне наиболее разумным решением, так это:

1) Сессии, чтобы не вмешиваться в счет за пределами игры.

2) Записывать каждое действие в игре и отправлять его на сервер результатов. Затем сервер рассчитает, действительно ли эти действия дают такую ​​оценку. Если вы также регистрируете время, проведенное за игрой, вы можете еще больше снизить вероятность того, что злоумышленник будет беспокоиться о себе, чтобы сломать вашу игру. Это также позволит вам создать сценарий воспроизведения, как у серверов Arcade с таблицами высоких результатов, а в случае подозрительного результата вы можете посмотреть его и решить, является ли счет реальным. Мошенник должен будет использовать умного бота, чтобы играть в вашу игру - и если у вас нет игры на реальные призы, никто не будет так стараться.

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

1 голос
/ 20 февраля 2010

1.) Любой сценарий CGI, который может общаться с базой данных и понимать JSON или другой формат по вашему выбору, сделает эту работу.

Однако, если вы знакомы с Django, создание вашего сервера поверх Django было бы самым простым, в смысле того, что вы должны изучить и сколько кода приложения вам нужно написать. Казалось бы, простой CGI-скрипт может оказаться довольно сложным, если вы напишите его с нуля.

Я нашел django-pneon удобным приложением Django для быстрого написания API-сервера в стиле REST. Он поддерживает JSON, поэтому он должен легко взаимодействовать с вашей игрой на JavaScript.

2.) Самый обычный взломщик пойдет на повторную атаку и ее варианты: заглянуть в исходный код страницы и выполнить функцию JavaScript, перехватить HTTP-запросы и отправить их заново (это легко сделать с помощью Firefox дополнения, такие как Tamper Data).

Чтобы противодействовать первому, вы можете запутать исходный код и текст HTTP;

  • Сократить код JavaScript
  • Кодировать сообщение, которое вы отправляете на сервер, с помощью Base64 или другого алгоритма кодирования

Последнее можно предотвратить, требуя, чтобы все запросы на обновление включали одноразовый пароль («маркер сеанса» в статье Википедии ), который был недавно получен с сервера.

0 голосов
/ 02 августа 2013

Лучше, я думаю, сделать подсчет очков непосредственно в файлах python вашего приложения django. Вместо того, чтобы рассчитать его в файле JavaScript. Вы отправляете данные для сравнения с базой данных с помощью запроса POST, затем вычисляете балл и сохраняете его в базе данных. Таким образом, вы не заставляете рассылать результаты через Интернет своим серверам. Что совершенно безопасно, потому что вы делаете только местные вещи.

0 голосов
/ 15 декабря 2010

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

Простое сообщение типа «Ваш высокий балл равен X, и он занимает ### в таблице рекордов. Чтобы опубликовать этот счет в Интернете, сначала зарегистрируйтесь у нас».

0 голосов
/ 19 февраля 2010

В ответ на ваш вопрос:

1.) Это зависит от вашей среды и предпочтений кодирования. PHP, Python, ASP.NET - вот некоторые из них, которые приходят на ум. Если вы уже знаете Python (из своего профиля), вы можете использовать для этого Python CGI-скрипт или использовать одну из многих сред Python (Zope, Django, Pylons, ...).

см .: http://www.python.org/doc/essays/ppt/sd99east/index.htm для получения информации о Python CGI.

2.) Несколько хитростей по безопасности: (нет или полное доказательство)

  • Скрытое текстовое поле в HTML с закодированным значением, которое сервер проверяет на соответствие cookie, чтобы обеспечить высокий балл с вашей страницы.
  • Серверный скрипт принимает значения только из определенного домена
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...