Избегание CSRF при обслуживании запросов AJAX или Flash - PullRequest
0 голосов
/ 14 сентября 2010

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

Теперь у меня есть URL-адрес, например www.example.com / update.php? score = 200 & uid = 234

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

Как я могу помешать кому-то позвонить по вышеуказанному URL и обновить его счет самостоятельно.

Ответы [ 2 ]

2 голосов
/ 21 сентября 2010

Возможно, вы захотите прочитать о взломе "Marblecake" в системе онлайн-опросов .

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

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

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

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

0 голосов
/ 16 сентября 2010

Вы не можете.

Это больше не вопрос CSRF. Поскольку у вас нет никакой аутентификации, любой на земле может обновить оценку всех остальных. Нет никакого способа предотвратить это.

Если вы беспокоитесь о безопасности, аутентифицируйте пользователя. Это по крайней мере помешает атакующему обновлять результаты в массовом порядке.

Тогда исправьте вашу проблему CSRF. К каждому из этих URL необходимо добавить уникальный токен.

...