Надежно предоставить уникальный секретный код победителю флеш-игры?

Вот что я хочу сделать: когда игрок выигрывает игру (закодированную в flash / actionscript), им предоставляется персональный секретный ключ, который они могут отправлять мне по электронной почте в обмен на приз. Затем я могу проверить ключ на моем конце, используя частный алгоритм.

Мне нужно спроектировать его так, чтобы хакеры практически не могли генерировать действительный призовой ключ без выигрыша в игре. Возможно ли это?

Я предполагаю, что любой SWF-файл в основном уязвим для декомпиляции, но я точно не знаю, насколько они уязвимы. Может быть, любой хакер для генерации действительного ключа будет доступен хакерам?

Я имею в своем распоряжении все методы в actionscript 3, а также сервер PHP / MySQL, и я управляю сервером, на котором будет размещаться игра.

Во-первых, не давайте пользователю «секретный» код для проверки.

При доставке страницы клиенту создайте «секретный» код. Вероятно, GUID с кодировкой base64 будет работать. Запишите руководство, когда оно было создано, и отпечаток пальца браузера в вашей базе данных.

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

Чтобы проверить, проверьте количество времени, которое прошло между генерированием guid. Также посмотрите на отпечаток браузера.

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

ОБНОВИТЬ
Я просто хотел указать на пару вещей, которые вы хотите включить. Во-первых, у @aaz была отличная идея спросить у игрока вопрос об игре в тот момент, когда они заполняют информацию о победителе. Это должен быть некоторый элемент, который рандомизирован. Вероятно, это не цвет, просто из-за количества людей, которые окрашены вслепую; но, конечно же, что-то, что вы можете контролировать и записывать на серверную сторону до доставки скрипта действия. По крайней мере, для публикации результатов потребуется определенный уровень вмешательства человека.

Во-вторых, у Джона Льюиса была хорошая идея записать их в игровых действиях и представить их. Возможно, любые координаты кликов могут быть сохранены и немедленно отправлены обратно на сервер и сохранены с отметкой даты / времени. Вы можете сравнить эти координаты в нескольких играх, чтобы искать шаблоны. Разумный анализ будет важен.

То, что вы действительно хотите сделать, – это безопасное определение победителя игры.

Это сложно, но, в зависимости от игры, вы можете попробовать:

  • постоянно проверять состояние игры с сервером (открытые двери, введенные номера, координаты на карте и т. д.), особенно в отношении времени (сколько времени потребуется для перемещения между координатами);

  • определить, будет ли игра выиграна или утеряна заранее (например, скретч-карты );

  • спросите у победителя вопросы об игре («какой цвет был коровой?»).

Отказ от ответственности: я не работаю со вспышкой.

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

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

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

Храните серверную часть сервера. Даже если это простой хеш md5, сохранение секретности секретности генерации является критическим. Добавьте несколько случайных символов в любой хеш, который вы создаете, поэтому он не будет выглядеть как хеш md5 или sha1.

Конечно, тогда проблема превращается в «как я знаю, что пользователь действительно выиграл игру»? Декомпиляция .swf позволила бы определенному пользователю понять, что вы отправляете «выиграл = 1» и стрелу, вы получаете выигрышный код ключа назад, после чего игра заканчивается, так сказать.

Чтобы дать вам представление о том, насколько это сложно:

Несколько лет назад был сайт, в котором предлагались dinky flash-игры, в которые вы играли, и выигрывайте очки, которые вы могли бы обменять на призы. Это было ужасно неряшливо в его кодировании, до такой степени, что вам приходилось подвергать сомнению здравомыслие операторов сайта. Некоторые из основных недостатков:

1) Был ежедневный опрос. Один вопрос с несколькими вариантами. Они ставят значение точки вопроса в форму опроса как скрытое значение. Он был представлен через GET. Вы могли бы вручную создать ответ и дать себе MAX_INT очки один раз в день, просто выполнив «response.php? SurveyID = XXX & choiceID = YYY & points = 4294967295» в адресной строке

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

3) После того, как они исправили это, люди перешли к взлому игр – игра в игру и победа привела бы вам (скажем) 100 очков. Здесь они были немного умнее при запуске и не обходили стороной значение точки через клиента. Но они забыли проверить количество раз, которое было сохранено на стороне клиента, поэтому вы можете требовать 100 очков столько раз, сколько вы могли бы запустить POST на своем сервере

4) После того, как это зафиксировало и переместило «время, проведенное» на сервер, люди просто держали своих ботов, отправляющих определенные лимиты игр, но подавали фиктивные претензии для КАЖДОЙ игры на сайте

5) После того, как они начали вводить контрольные точки в игру (например, «сказать, что уровень сервера 1 завершен», «посмотреть, они только что закончили уровень 2» и т. Д.), Люди просто добавили сообщения о контрольных пунктах в их точки кражи ботов.

и так далее по дороге …

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

Короткий ответ:

Вы не можете.

Длительный ответ:

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

Что ты можешь сделать:

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

Извините за плохие новости.