Как таблица рекордов отличает честный счёт
В «Ловись, рыбка» есть таблица лидеров, но регистрации нет: ввёл имя и записался. Счёт при этом считает браузер, так что сервер в принципе не может проверить его точно. Любой, кто откроет консоль разработчика, может отправить хоть миллион очков. Поэтому задача была не «сделать подделку невозможной», а «сделать её бессмысленной».
Жетон партии
Когда начинается партия, игра просит у сервера жетон. В нём время начала, случайное число и подпись секретным ключом сайта:
def game_token(con):
payload = '%d.%s' % (int(time.time()), secrets.token_hex(8))
return '%s.%s' % (payload, game_sign(con, payload))Подправить время в жетоне не получится: подпись перестанет сходиться. Значит, сервер всегда знает, когда партия началась на самом деле. Жетон живёт три часа.
Сколько очков можно успеть набрать
Дальше простая арифметика. За каждую секунду игры можно набрать не больше определённого числа очков, и это число я не придумал, а померил. Когда я гонял игру ботом без браузера, он ловил всё подряд, и даже у него темп не выходил за определённый предел. Сервер берёт этот предел с запасом в полтора раза, чтобы удачная партия живого человека в него не упиралась.
if not 0 < score <= GAME_HEAD_START + GAME_MAX_RATE * min(age + 2, max(played, 0)):
raise HttpError(400, 'Счёт не сходится со временем игры.')age — сколько прошло по жетону, played — сколько длилась партия по словам самой игры. Берётся меньшее: пауза лишних очков не даёт, а соврать про время в большую сторону не выйдет.
Из-за этой проверки у новых событий в игре скромные награды. Иначе честный хороший результат выглядел бы для сервера как читерский.
Один жетон — одна запись
Потратить жетон можно один раз, а с одного адреса записаться можно не больше нескольких десятков раз в час. Всё это хранится только в памяти и пропадает при перезапуске сервера, адреса никуда не записываются.
От чего это не спасает
Можно сыграть честно, а отправить счёт чуть выше, в пределах возможного. Можно записаться под чужим именем, если набрал больше. Для игры про котика и огурцы этого достаточно: чтобы обойти защиту по-настоящему, проще научиться хорошо играть.