2013-11-18 3 views
1

Никогда не доверяйте клиенту. Это моя кодирующая мантра. Все javascript могут, с достаточным усилием, быть перезаписаны или скомпрометированы. То, что я хочу понять, это то, как.Степени уязвимости JS

Предположим, что я написал функцию checkStep() для игры - каждый раз, когда игрок перемещается на один пробел, он проверяет сервер на наличие каких-либо событий: восстановление HP, ввод случайной битвы, переход к следующей карте и т. Д. Я спросил себя «Я, как я могу переписать или отключить эту функцию?» Исследования выявили некоторые противоречивые результаты. Некоторые источники говорят, что функции могут быть напрямую переопределены с консоли, другие говорят, что это будет гораздо более сложный процесс.

Мой вопрос: что бы игрок должен был сделать, чтобы переписать или отключить функцию checkStep()? Могут ли они просто переопределить его с консоли? Должны ли они копировать, модифицировать и повторно размещать мой код? Как бы вы это сделали?

Please note, I'm not asking how to make this function secure. The first person to leave an answer/comment along the lines of "you can try minifying it, but it still wont be secure" or "put in some server-side checks" is getting bludgeoned with a semicolon, as an example to the rest.

+2

Игроку не нужно ничего переписывать или использовать консоль вообще. Браузер запускает javascript на компьютере пользователя, отправляет POST или GET запросы на ваш сервер, а любой компьютер, даже один из 1996, работающий под управлением DOS 3.0, может отправлять запрос GET или POST, содержащий все, что им нравится, то же самое касается любой команды Linux линии и даже некоторых калькуляторов. Итак, если мне нужно выяснить, что вы используете MySQL для хранения того, что отправлено на сервер, и что фильтрация не происходит, я могу из командной строки отправить запрос, содержащий простую команду SQL, которая удаляет целая БД. – adeneo

+0

@adeneo хорошая вещь Я не такой глупый. – CodeMoose

+0

Ах, но вы были бы удивлены тому, как мало это нужно, просто небольшая ошибка при проверке формы или даже оставлении чего-то открытого на сервере, который генерирует страницы, может привести к тому, что кто-то выяснит способ нанесения урона или получить доступ к вещам у них не должно быть доступа. – adeneo

ответ

2

Вы можете использовать прокси-сервер отладки для веб-поиска, например Fiddler, чтобы сделать это для вашей локальной машины. Такие программы позволяют перехватывать контент, который вы загружаете, и возиться с ним. Таким образом, вы можете написать новую версию функции, а затем использовать программу, чтобы заменить ее своей версией, когда файл загружается с сервера. Затем для вашей локальной машины код будет работать с новой функцией. На странице web session manipulation на сайте Fiddler есть еще несколько деталей.

+0

Именно то, что я искал. Благодаря! – CodeMoose

0

Нет никаких оснований использовать Javascript или браузер.

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

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

+0

Это полезно знать, но я не подвергаю клиенту никакого кода управления событиями. 'checkStep' не передает ничего, кроме текущей позиции карты, на сервер - и сервер уничтожает любые данные, которые он получает в этом запросе, отличные от позиции. Все возвраты сервера - это инструкция о том, какие события были проверены и должны отображаться. JS - это всего лишь механизм рендеринга. В худшем случае игрок может фальсифицировать свое местоположение и пропустить к другому концу карты, и в этом случае это не является игровым. – CodeMoose

+0

@CodeMoose Весь код, работающий на стороне клиента, бесполезен. Единственное, что имеет значение, - это то, как клиент взаимодействует с сервером, и это можно сделать без использования какого-либо кода клиента или даже браузера. – Esailija

+0

Я понимаю это. Даже если пользователь успешно захватывает токен сеанса и соответствующий файл cookie, большинство серверов будет принимать повторное срабатывание функции 'checkstep()', и все, что собирается получить их, - это различные крошечные ответы типа '{battle: 0, hp : 45} '' {битва: 1, hp: 47} '' {ошибка: «битва занята»} 'Если они разорвут код на стороне клиента, все, что они собираются сделать, это уничтожить игру для себя. – CodeMoose

0

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

var checkStep = function() { 
    ... // your original function 
} 

// later on 
checkStep = function() { 
    alert('foo'); 
} 

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

Смежные вопросы