Самый безопасный способ обновить счет игры от базы данных клиента до сервера?Javascript - PullRequest
13 голосов
/ 19 января 2011

Итак, у меня есть эта игра, которая полностью запущена на клиенте.Никакого взаимодействия с сервером, за исключением загрузки начальных сценариев для игры.В любом случае, в конце игры я хотел бы, чтобы клиент отправил мне обратно результаты, которые должны быть обновлены в базе данных сервера.Теперь я пришел, чтобы признать тот факт, что на земле нет никакого способа, которым я могу скрыть это от хакера и отправить результаты в неизменном виде.Но я хотел бы знать, до какого уровня я могу изменить весь процесс, чтобы он стал практически невозможным для хакера манипулировать отправляемыми данными.Конечно, я не хотел бы, чтобы результаты были отправлены в виде простого текста с клиентского компьютера, и я не хочу, чтобы мой сервер выполнял сложный алгоритм дешифрования.Следовательно, это лучший способ добиться значительного уровня безопасности, чтобы каждый член семьи и Гарри не взламывали баллы ... Я надеюсь, что кто-то может предоставить хороший маленький способ, над которым я мог бы работать ... :) Спасибо

Таким образом, мой идеальный результат должен быть -> иметь достоверный результат из расчета (оценки), сделанного ненадежной стороной (игроком)!

-Edit-

Кто-то сказал мне что-тоо сокрытии данных в картинке запрос на получение.Мол, я реализую эту игру на холсте (html5).Поэтому он попросил меня в конце игры загрузить игру поверх изображения с моего сервера, и они должны содержать хэшированную оценку.Я не совсем понял весь процесс, но если бы вы могли объяснить это, был бы очень рад!:)

coda ^, чтобы вы могли красиво маскировать запросы

shouvik, как мне это сделать!?

coda ^ вы можете составить контрольную сумму, которую хотитеОтправить.как 12312312a12313a232 ваш md5, который содержит счет.добавьте в холст ресурс, такой как

coda ^ server.com/images/md5_hash_of_score/congratulations.png

coda ^, который можно переписать на стороне сервера через htaccess

Ответы [ 5 ]

4 голосов
/ 19 января 2011

Вы, кажется, уже знаете это, но только для того, чтобы подчеркнуть; вы не можете остановить кого-то, делающего это;Вы можете сделать это только настолько сильно, насколько это возможно!

Предположим, что вы в настоящее время отправляете счет как:

/submit_score.php?score=5

Кто-то, смотрящий в Firebug, может легко определить, куда отправляется счет, иизменить это.submit_score.php выдает его, как и имя параметра.Счет представляет собой легко различимое целое число.

  1. Изменить конечную точку: /interaction.php?score=5
  2. Изменить имя параметра: /interaction.php?a=5

Получаетсяпользователю сложнее понять, что происходит.

Теперь вы можете сделать счет сложнее (опять же, сложнее, не невозможно) измениться.Во-первых, вы можете зашифровать его (очевидно, вам понадобится расшифровать его позже).

  1. Base 64 закодировать его.
  2. Числа -> Буквы (1 = a,2 = b и т. Д.).
  3. Обратный порядок представления партитуры.

Вы называете это, вы делаете это.Итак, теперь у вас есть interaction.php?a=e.

Следующее, что вы можете сделать, - это хешировать счет чем-то другим.Отправьте хэш с оценкой и пересчитайте его на сервере.Например, md5() оценка со случайной строкой и отправка счета (в кодировке), строки и хэша в запросе:

/interaction.php?a=e&str=abcde&hash=123456789abcefbc

Когда запрос попадает на сервер, выполните:

if (md5($_GET['a'] . $_GET['str']) !== $_GET['hash']) exit;

Очевидно, что люди могут (относительно) легко просмотреть ваш код JavaScript и посмотреть, что происходит;так им там труднее.Сократите и запутайте код.

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

1 голос
/ 19 января 2011

«Теперь я пришел к выводу, что на земле нет никакого способа, которым я могу скрыть это от хакера и отправить результаты в неизменном виде».

Ах да, есть!

Вы можете использовать RSA или любой другой метод шифрования с открытым ключом (также называемый ассиметричной криптографией).

Создание набора (открытых и закрытых) ключей для сервера. Пусть ваш клиентский код включает открытый ключ вашего сервера.

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

Сервер расшифровывает и проверяет, совпадают ли простой счет и один расшифрованный. Если да, примите оценку. Если нет, откажитесь (в центре хакерская или сетевая ошибка).

------- UPDATE ----------- CORRECTION --------------

Как отметил Амброзия, мой подход полностью проваливается при такого рода атаках.

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

См. Это: http://coltrane.wiwi.hu -berlin.de / ~ fis / text / 2003-profit-untrust.pdf

Также этот: http://www.cse.psu.edu/~snarayan/publications/securecomputation.pdf

И это (для которого требуется подписка на цифровую библиотеку ACM): http://portal.acm.org/citation.cfm?id=643477.643479

0 голосов
/ 05 января 2019

Используйте что-то вроде OAuth для авторизации запроса от клиента к серверу.Заголовок содержит токен, который соответствует телу запроса.если эти два не совпадают, тогда отклоните запрос.Не нужно расшифровывать на стороне сервера, вместо этого зашифруйте тело и проверьте, совпадают ли результаты, полученные на стороне сервера, и токен, чтобы найти, было ли изменено тело

0 голосов
/ 19 января 2011

Заставьте клиента отправлять вам учетные данные (или какую-либо информацию о сеансе в случае, если у вас нет учетных данных для входа в систему) и делайте это через SSL (https). Таким образом, вы получаете как аутентификацию, так и контроль целостности. Очень простой и чрезвычайно легкий как для сервера, так и для клиента.

0 голосов
/ 19 января 2011

Можете ли вы использовать ajax для отправки счета (и любых идентификаторов) на сервер?Если у них не будет что-то вроде открытого клопа, они не увидят, что это происходит.

var url = '/savescores.asp?userID=fredsmith&score=1098';
createRequest();
request.open('GET', url, true);
etc
...