Самый надежный способ обновить игровой счет от базы данных от клиента к серверу? Javascript
Итак, у меня есть эта игра, которая полностью запущена на клиенте. Нет взаимодействия с сервером, что никогда не было, кроме загрузки исходных скриптов для игры. Во всяком случае, в конце игры я бы хотел, чтобы клиент отправил мне оценки, которые должны быть обновлены в базе данных сервера. Теперь я пришел, чтобы принять тот факт, что на земле я не могу скрыть это от хакера и отправить оценки без изменений. Но я хотел бы знать, до какого уровня я могу изменить весь процесс, который практически становится недопустимым для хакера, манипулирующего передаваемыми данными. Конечно, мне не хотелось бы, чтобы оценка была отправлена как обычный текст с клиентского компьютера, и я не хочу, чтобы мой сервер выполнял сложный алгоритм дешифрования. Каким образом наилучшим способом добиться значительного уровня безопасности, чтобы каждый член и Харри не взламывали оценки... Надеюсь, кто-то может обеспечить хороший маленький способ, которым я мог бы работать...:) Спасибо
Таким образом, мой идеальный результат должен быть → иметь верный результат из расчета (оценки), сделанного ненадежной стороной (игроком)!
-Edit -
Кто-то сказал мне что-то о том, чтобы скрыть данные в запросе получения изображения. Например, я реализую эту игру на холсте (html5). Поэтому он попросил меня в конце игры получить игру с изображением с моего сервера, и они должны содержать хэшированный балл. Я не совсем понял весь процесс, но если бы вы могли это объяснить, было бы действительно рад!:)
coda ^, чтобы вы могли легко маскировать запросы
shouvik как это сделать??
coda ^ вы можете составить контрольную сумму, которую хотите отправить. например, 12312312a12313a232 - это ваш md5, который содержит оценку. принесите актив в холст, например
coda ^ server.com/images/md5_hash_of_score/congratulations.png
coda ^, которую вы можете переписать на стороне сервера через htaccess
Ответы
Ответ 1
"Теперь я пришел, чтобы принять тот факт, что на земле я не могу скрыть это от хакера и отправить оценки без изменений".
О да, есть!
Вы можете использовать RSA или любой другой метод шифрования с открытым ключом (также называемый ассиметричной криптографией).
Создайте набор (открытых и закрытых) ключей для сервера.
Введите код вашего клиента в общий открытый ключ вашего сервера.
В конце игры клиентский код зашифровывает счет (с помощью этого ключа) и отправляет на сервер (как простой, так и зашифрованный балл).
Сервер расшифровывает и проверяет, одинаковы ли простые и дешифрованные.
Если да, примите оценку.
Если нет, отклоните (там хакер или сетевая ошибка посередине).
Забастовкa >
------- UPDATE ----------- CORRECTION --------------
Как отметила Амброзия, мой подход полностью не справляется с такой атакой.
То, что вы на самом деле хотите, - это получить доверенный результат от расчета (оценки), сделанного ненадежной стороной (игроком). Нет простого способа достичь этого.
Смотрите это: http://coltrane.wiwi.hu-berlin.de/~fis/texts/2003-profit-untrust.pdf
Также этот: http://www.cse.psu.edu/~snarayan/publications/securecomputation.pdf
И это (которому нужна подписка на цифровую библиотеку ACM): http://portal.acm.org/citation.cfm?id=643477.643479
Ответ 2
Вы, кажется, уже знаете это, но просто для того, чтобы подчеркнуть; вы не можете остановить этого; вы можете сделать это как можно сильнее!
Предположим, что вы в настоящее время отправляете баллы как:
/submit_score.php?score=5
Кто-то, смотрящий в Firebug, может легко отличить, где представлен счет, и изменить его. submit_score.php
отдает его, как и имя параметра. Оценка - это легко различимое целое число.
- Изменить конечную точку:
/interaction.php?score=5
- Измените имя параметра:
/interaction.php?a=5
Все труднее для пользователя выработать то, что происходит.
Теперь вы можете сделать счет сложнее (опять же, сложнее, а не невозможно), измениться. Во-первых, вы можете зашифровать его (очевидно, вам нужно будет его убрать позже).
- База 64 кодирует его.
- Числа → Буквы (1 = a, 2 = b и т.д.).
- Обратный порядок представления оценки.
Вы называете это, вы это делаете. Итак, теперь у вас 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, не понимая, что происходит, и не беспокойтесь; ради получения нескольких дополнительных очков в вашей игре.
Ответ 3
Можете ли вы использовать ajax для отправки счета (и любых идентификаторов) на сервер? Если у них нет что-то вроде firebug open, они не видят, что это происходит.
var url = '/savescores.asp?userID=fredsmith&score=1098';
createRequest();
request.open('GET', url, true);
etc
Ответ 4
Заставьте клиента отправить вам учетные данные (или какую-либо информацию о сеансе, если у вас нет учетных данных для входа в систему) и выполните это через SSL (https). Таким образом, у вас есть аутентификация и контроль целостности. Очень легкий и чрезвычайно легкий как для сервера, так и для клиента.