2012-05-03 2 views
3

Я начинаю собирать онлайн-игру, в которой большая часть игры написана на javascript. Мне показалось, что с помощью таких инструментов, как FireBug, игрок игры может легко манипулировать javascript и делать то, что игра не намеревалась (например, позволить персонажу прыгать в два раза выше).В javascript-игре можно ли полностью запретить пользователю манипулировать JavaScript?

Это становится еще хуже, если я настраиваю функцию, чтобы опубликовать результаты на табло. Мало того, что игрок сможет получить неточные оценки, но если они выяснили, как результаты были размещены на сервере, тогда они могут построить вызов AJAX от FireBug, чтобы опубликовать любой результат, который они хотели.

Эта особая проблема связана с играми, но основная проблема связана с безопасностью JavaScript, которая может применяться ко многим другим веб-приложениям.

ответ

3

Нет, это абсолютно невозможно.

Вы можете использовать обфускацию, вы можете сделать ваш AJAX действительно уродливым, и в итоге вам понадобится не более 5 минут, чтобы обойти любую клиентскую защиту, которую вы используете.

Вам необходимо проверить все, что связано с безопасностью, на стороне сервера, включая подсчет очков. Как это сделать, зависит от вашей реализации.

+1

Я думаю, что 5 минут - это преувеличение. Обфускация может занять много времени, чтобы понять, что менять где. Однако кто-то это сделает. –

+2

@SarelBotha, я сомневаюсь. Обфускайте свой код все, что хотите, и я запустил Fiddler и/или Wireshark и очень быстро выясню, что вы отправляете по проводу, и как. Кроме того, есть несколько хороших инструментов для очистки JS. Думаю, 5 минут, чтобы сломать это очень разумное время. – Brad

+0

Теперь, если предмет защиты - это данные, проходящие через провод, тогда вы также можете реализовать кодирование данных, чтобы усложнить ситуацию. Опять же, это можно понять; это просто делает его более трудоемким. –

3

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

2

Сделайте много проверок. Если максимальный прыжок составляет 5 блоков, убедитесь, что сервер не принимает прыжки выше 5.

Когда я делаю игры, я проверяю каждую вещь. Даже если есть вероятность 1%, что пользователь сделает что-то, чтобы взломать эту вещь, она по-прежнему защищена.

+0

Хорошее предложение. например ММО и некоторые покерные системы принимают аналогичный ответ, чтобы определить, когда кто-то пытается обмануть систему. Рекомендуется передавать состояние и действия как можно чаще на сервер и определять сервер, является ли дельта от одного состояния к другому разумным или нет и соответствует всем действительным данным, полученным на протяжении всего сессии, на время. – Cheekysoft

-1

Да, вы можете защитить свою игру. Например, позволяя читерам решать чрезвычайно трудную загадку, которая использует неправильное направление.

пример Контекст

Рассмотрим игру, которая полностью зависит от 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-функции для скрытия кода является одним из многих вариантов. Вы можете думать о многих разных способах неверного направления и демонстрации потенциального мошенника.

Это похоже на усиленную дверь в ваш дом. Они больше не могут просто постучать в дверь, но нужно потратить больше времени, чтобы войти.

+0

Downvoter, не могли бы вы дать конструктивную обратную связь в комментарии? – Yeti