Безопасная онлайн-игра http get / post request (Как избежать повторной отправки одного и того же http-запроса) - PullRequest
2 голосов
/ 16 августа 2010

В моей игре / приложении (iPhone) клиентская сторона отправляет http-запросы (get или post) на http-сервер игры. Запросы имеют эту форму:

gameserver.com / идентификатор пользователя / givebonus / 100

Это, например, даст userId бонус 100.

Теперь мы зашифруем запрос к серверу, и он станет примерно таким:

gameserver.com / 42c34c234c234 / ghjghjg4hj32g42jh2 / 424j23gh4h234h2j34j23

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

gameserver.com / 42c34c234c234 / ghjghjg4hj32g42jh2 / 424j23gh4h234h2j34j23

Дает бонус +100 , он может просто продолжать посылать один и тот же запрос снова и снова .

Так как вы можете предотвратить это?

Разговор с несколькими друзьями - это возможные решения, но ни одно из них не будет ни простым в реализации, ни более безопасным:

  • Перемещение всех (большей части) стороны логического сервера.
  • Рукопожатие на первый запрос и ответ только на этот mac-адрес. (Это не сработает, я думаю)
  • Динамическое изменение личного ключа шифрования? Как?
  • Шифровать все запросы, в основном используя https? (Хотя не знаю как :()

Я уверен, что есть более простой ответ, которого я не вижу: P

Ответы [ 2 ]

1 голос
/ 16 августа 2010

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

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

Но не думайте, что это как-то "безопасно", потому что это , а не .

0 голосов
/ 16 августа 2010

Вы можете использовать вариант того, что используется для предотвращения CSRF-атак на веб-сайты (я предполагаю, что вы контролируете сервер):

  • Пусть клиент отправит запрос GET на http://gameserver.example/userId/givebonus,
    • Создание UUID или чего-то подобного на стороне сервера, который вы сохраняете в БД на сервере, связанный с этим идентификатором пользователя в некой «ожидающей» таблице.
    • Ответ на этотGET должен содержать этот UUID (как скрытый токен в форме HTML)
  • Пусть клиент отправит запрос POST, содержащий этот UUID и баллы, которые вы хотите дать.
    • На сервере проверьте UUID из БД и выполните приращение, только если это не было сделано ранее.Удалите его из списка ожидания во время транзакции.

(Есть несколько вариантов этого, когда вы могли бы подписать токен, но я думаю, что это будет трудно сделатьповторение нового UUID в целом.)

В качестве примечания я бы рекомендовал не делать приращения при помощи запросов GET на http://gameserver.com/userId/givebonus/100.GET должен быть безопасным методом, то есть вы можете делать это столько раз, сколько захотите, и это не повлияет на состояние сервера;это дизайн HTTP и REST.Понятно, что это может вызвать проблемы, если вы предпримете действия на GET.Тогда я бы предложил использовать POST для действий с побочным эффектом и поместить сумму и, возможно, имя действия в сущность запроса.

(Конечно, использование HTTPS вместе с этим не повредит).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...