Предотвращение мошеннической отправки на табло
-
21-08-2019 - |
Вопрос
Я работаю над бэкэндом для флеш-игры, и мне нужно безопасный данные, поступающие на табло.
Игра будет размещена на многих сайтах в виде баннерной рекламы, пользователь сыграет в игру в рекламе, а затем перейдет на основной сайт, чтобы сохранить свои данные.
В данный момент я думаю примерно так
- Пользователь играет в игру и нажимает, чтобы отправить свой результат
- В фоновом режиме баннер отправляет оценку и исходный домен скрипту на главном сайте.
- Скрипт проверяет, является ли домен одним из допустимых доменов, на которых размещается реклама.
- Если все правильно, скрипт создает хэш этой оценки и домена и сохраняет его в базе данных вместе с оценкой.
- Скрипт возвращает хэш во Flash, который помещает его в строку запроса getURL, которая открывает главное табло
- Страница табло проверяет реферера, чтобы убедиться, что это один из действительных доменов.
- Если это так, то он проверяет базу данных на наличие хэша, чтобы убедиться, что это действительный токен
- затем пользователь заполняет свои данные, и запись обновляется на основе хэша
В прошлый раз, когда я проверял, FLash не отправляет информацию о реферере, что в некотором роде мешает моему плану.Итак, существует ли уже установленный шаблон для такого рода взаимодействия Flash / базы данных?
Какой тип хеширования / контрольной суммы я должен использовать на шаге 4?Каково правильное название для такого рода операций, это хэш, контрольная сумма или что-то еще?
Я понимаю, что, будучи клиентской технологией, Flash на самом деле никогда не будет НАСТОЛЬКО безопасным, но, на мой взгляд, что-то подобное описанному выше примерно так же сложно, как вы собираетесь это сделать, чтобы взломать такого рода приложения.
Обновить:Моя главная цель - усложнить людям поиск URL скрипта, который добавляет оценку в базу данных, и просто спамить ее поддельными оценками.
Спасибо, Грег
Решение
Ранее я работал в игровой индустрии и делал что-то в этом роде.Насколько мне известно, никто никогда не утруждал себя расшифровкой части представления партитуры.
То , как это было сделано , было :
- Сгенерируйте случайное число в виде соли (из flash)
- Закодируйте результат с помощью математических операций, основанных на соли (из flash)
- Добавьте контрольную сумму, чтобы убедиться, что оценка не была изменена (из flash)
- Отправьте оценку и любые необходимые данные на страницу отправки оценки
- На сервере проверьте, что оценка не была уменьшена, используя контрольную сумму
- Если оценка действительна, то вставьте ее в базу данных, в противном случае отклоните ее
- Если вы хотите, вы можете регистрировать IP-адреса отправителей оценок, нарушающих контрольные суммы (возможно, политика трех неверных контрольных сумм, вы выбываете) и добавить скрипт, запрещающий им доступ к серверу на 1 час, но это, вероятно, не потребуется, если только кто-то не захочет настолько сильно взломать ваш код.
Примечание :Хеширование / контрольная сумма были выполнены с использованием пользовательской функции.Не нужно было что-то очень надежное.Это было сделано с использованием расчета соли и счета.Некоторые простые математические операции, такие как суммы, умножения и вычитания.
Редактировать:простой алгоритм / математика для контрольной суммы
Допустим, у вашего пользователя есть оценка в 5885.
Вы генерируете случайное число в виде соли из 134789 (постоянная длина, накладка с 0)
Зашифрованный счет = Оценка * Соль (здесь вам следует использовать что-то немного более сложное, но это всего лишь пример)
В нашем примере зашифрованная оценка будет равна : 793233265
Теперь что касается контрольной суммы, допустим, вы хотите иметь значение 253 в качестве контрольной суммы.
Вы добавляете все цифры вашего зашифрованного счета 7+9+3+2+3+3+2+6+5 = 40
Теперь вы вычисляете значение вашей контрольной суммы для этого балла
253 - (Сумма зашифрованных чисел баллов % 253)
Теперь у нас есть следующие цифры:
соль = 134789
зашифрованный счет = 793233265
контрольная сумма = 40
Вы делаете запрос на сервер, отправляя 134789793233265040 как оценка.
На сервере score вы можете разделить 793233265 Автор: 134789 отдающий 5885 и проверьте контрольную сумму, используя ту же функцию, что и раньше.
Если контрольная сумма не задана, значит, цифры были подделаны.
вероятно, вы могли бы в конечном итоге получить что-то гораздо более безопасное, но это должно сработать.
Другие советы
По сути, вы не хотите проверять, что счет поступает от законного клиента, вы хотите убедиться, что клиент действительно играл в игру, чтобы набрать очки.По сути, лучшее, на что вы можете надеяться, - это то, что людям потребуется создать искусственный интеллект, чтобы играть в игру.
Вот пара вещей, которые вы можете попробовать:
- Внесите входные данные в игру и отправьте их вместе со счетом.Затем сервер может подтвердить, что счет соответствует возможной игре.Таким образом, вы также можете обнаружить дублирующиеся отправки.
- Примените ограничение скорости, чтобы помешать клиентам выставлять оценки с явно нечеловеческой скоростью.Применяйте верхние ограничения к допустимым баллам, основываясь на том, чего на самом деле можно достичь, и более низкие ограничения на такие вещи, как количество действий в секунду.
- Используйте предыдущие входные данные для частичного заполнения генератора псевдослучайных чисел (при условии, что вы его используете).Это снижает вероятность того, что клиенты могут немного изменить отправку и все равно получить действительную комбинацию игра / счет.