Да, вы можете защитить свою игру. Например, позволяя читерам решать чрезвычайно трудную загадку, которая использует неправильное направление.
пример Контекст
Рассмотрим игру, которая полностью зависит от JavaScript, и не на стороне сервера игры состояния. Во время игры очки собираются, и в конце игры эти очки отправляются на сервер, чтобы поместить игрока в таблицу лидеров.
Leaderboard проблема
Наиболее важная часть игры состоит в том, что кто-то может контролировать сетевой трафик, и изменить его по своему усмотрению. Все остальные аспекты игры можно предотвратить, сохранив игровое состояние на сервере, но это выходит за рамки моего ответа.
Реализация «Ключ безопасности»
Считают, что вы уследить точек в JavaScript Object, как это:
results = [
{score: 12, epoch_ms: 15236543784, security_key: 6b42535e89f7fb1cc5abbe53d267ee0e},
{score: 4, epoch_ms: 15236542565, security_key: 8af02a3d473d6b9c0a0362cfa59567d8},
{score: 5, epoch_ms: 15236564511, security_key: 40f6611ff3156d935f420eb746ac897f}
];
На стороне сервера, то security_key
проверяется весь пакет {score: ?, epoch_ms: ?}
. Если это не удается, то с сервера возвращается демотирующее сообщение: «Ошибка. Неверный ключ безопасности. В следующий раз ваша учетная запись будет запрещена из-за обмана. "Как предотвратить людей от новых учетных записей все время выходит за рамки этого ответа, но, безусловно, очень хороший способ сделать это.
Как создать ключ безопасности
Код для генерации security_key
может быть что-то вроде этого:
result.security_key = your_over_the_top_complicated_algorithm(result, md5(result));
...
function your_over_the_top_complicated_algorithm(result, seed)
{....}
...
Теперь security_key
создается с очень запутанным и сложным алгоритмом, который использует очень длинные регулярные выражения и любые другие Убедитесь, что кто-то пытается выяснить, как она работает, что. для поддержки требуется не менее недели (вы можете каждый раз обновлять свой алгоритм каждую неделю, чтобы демотировать любую последующую обратную инженерию).
Для того чтобы этот код работал, вы также должны включить существующую библиотеку, которая реализует использованный хэш-алгоритм (md5.js
), использование этих хэшей также может быть встроено в ваш сложный алгоритм, если библиотека является отдельной файл.
Дурачить
Хитрость заключается в том, что - в то время как мошенник пытается определить, как победить этот сложный алгоритм - когда result
передаются в качестве ссылки где-то на внешнюю уменьшенную функции хеширования, как md5
. Однако внешняя функция md5 на самом деле является нашей собственной модифицированной версией, мы добавили немного кода для нее, которая жертвует точностью эпохи значения result.epoch_ms
для хранения хэша на основе оценки (и, возможно, других элементов в результате - объект).
Например. Если epoch_ms
равен «15236564511
», а score
- «5
». Затем, когда мы вызываем где-то вдоль линии md5(result)
, чтобы функционировать как семя для нашей сверхпрочной сложной функции. А между тем, в этом внешнем md5-код ...
function md5(r)
{
...
r.epoch_ms=(r.epoch_ms+'').slice(0, -2)+(1234.56*r.score+'').slice(1,3);
// or obfuscated (to prevent searching for terms like 'epoch_ms'):
var _0x5da4=["\x65\x70\x6F\x63\x68\x5F\x6D\x73","\x73\x6C\x69\x63\x65","","\x73\x63\x6F\x72\x65"];r[_0x5da4[0]]= (r[_0x5da4[0]]+ _0x5da4[2])[_0x5da4[1]](0,-2)+ (1234.56* r[_0x5da4[3]]+ _0x5da4[2])[_0x5da4[1]](1,3)
...
}
Когда две последние цифры epoch_ms
не соответствуют простой хэш на основе score
, то сервер возвращает ту же ошибку, как будто в security_key
является недействительным. Это неотъемлемая часть неправильного направления.
Остерегайтесь
Этот подход является nobrainer реализовать. Нет компромиссов. Проблема в том, что решение этой головоломки скрыто на виду. Как только неправильное направление выходит из строя, и кто-то проверяет файл md5.js
и ищет способы использования r
, это «игра закончилась».
Также обратите внимание, что Я просто сделал это сам и не имел личного опыта с тем, достаточно ли этого, чтобы остановить читеров в веб-игре на основе javascript. Возможно, я пропустил огромную слабость этого подхода. Пожалуйста, комментарий, если вы нашли слабость, это слаборазвитая идея, так что приятно :)
Это не криптографически безопасный вообще, а также со всеми системами анти-читов, в конце концов, кто-то выяснить это. Я думаю, что трюк заключается в том, чтобы сделать его как можно более трудным с наименьшим успехом.
Несмотря на то, что это относительно простой пример, с достаточным обфускацией, стеганографией, строгой политикой запрета (вероятно, мошенник совершит ошибку при первой попытке), дальнейшие улучшения и простоту реализации кажется Примите дополнительную осторожность. Использование md5-функции для скрытия кода является одним из многих вариантов. Вы можете думать о многих разных способах неверного направления и демонстрации потенциального мошенника.
Это похоже на усиленную дверь в ваш дом. Они больше не могут просто постучать в дверь, но нужно потратить больше времени, чтобы войти.
Я думаю, что 5 минут - это преувеличение. Обфускация может занять много времени, чтобы понять, что менять где. Однако кто-то это сделает. –
@SarelBotha, я сомневаюсь. Обфускайте свой код все, что хотите, и я запустил Fiddler и/или Wireshark и очень быстро выясню, что вы отправляете по проводу, и как. Кроме того, есть несколько хороших инструментов для очистки JS. Думаю, 5 минут, чтобы сломать это очень разумное время. – Brad
Теперь, если предмет защиты - это данные, проходящие через провод, тогда вы также можете реализовать кодирование данных, чтобы усложнить ситуацию. Опять же, это можно понять; это просто делает его более трудоемким. –