PDA

Просмотр полной версии : Безопасная пересылка переменных


romulko
04.02.2008, 23:10
Здравствуйте.
Хочу сейчас затронуть теоретическую тему по поводу безопасной передачи переменных из флеша в пхп.
Делаю игру, и, после каждой последующей минуты передается информация про текущее состояние счета игрока.

Игра идет на кредиты, которые игрок должен набирать понемножку.

Знакомый программист говорит, что можно очень легко перехватить переменные и выслать скрипту новые данные (например, сразу 1000 кредитов).

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

Спасибо.

etc
04.02.2008, 23:31
Перехватить можно все. Поэтому надо сделать так, чтобы перехватывать нечего было.
Такие вещи, как инкрементация кредитов должны происходить на стороне сервера, а не клиента. Все действия, которые делает юзер, должны отсылаться на сервер, где будет просчитана соответствующая логика.

romulko
05.02.2008, 02:30
Но, например, эти самые действия можно посылать и не флешем?

Суть игры такова - двигаются вагонетки с золотом и камнем. Если юзер вытаскает золото, к общей сумме инкрементируется стоимость вытащенного золота (http://cs.if.ua/game). Если, допустим, отсылать запрос на сервер, что юзер только что взял золото, то этот же запрос можно также подделать?

Как же быть?
Спасибо.

etc
05.02.2008, 02:33
Отправлять на сервер «юзер ткнул по такой-то вагонетке». А уж вытащил или нет — решает сервер, а не клиент.

2morrowMan
05.02.2008, 02:55
Флеш-клиент только показывает юзеру то, что происходит на сервере + отсылает серверу комманды юзера! На сервере нужно проверять комманды прийнятые от клиента на корректность, так как можно и без клиента отправить серверу комманды не допустимые в данный момент или вообще! Короче и т.д. и т.п. ;)

romulko
07.02.2008, 12:15
Спасибо ребята за месседжы. Будем выходить таким способом -
В базе создадим еще одно поле с циферками. Оно будет служить для защиты от вызовов метода для добавление новых значений золота в базу. Суть - как только пользователь загружает игру, в хмл пхп передаст ему секретное значение набора цифр, и, в базу запишет тоже число.

Как только пользователь начинает тащить золото, скрипту пересылается количество вытаскиваемого золота вместе с этим и секретная переменная. пхп проверяет, одинаковое ли значение принятой переменной от флеша и та, что есть в базе. Если совпадает, делается запись и генерируется новое число, записывается в базу и передается опять во флеш.

iNils
07.02.2008, 17:14
А что мешает посмотреть какое число пришло и использовать его в своих целях?

romulko
07.02.2008, 17:25
А как-же он будет знать это число? Как мне программер сказал, перехватывать можно только передачу параметров. Юзверь сможет получить число уже то, что будет неактуально, так как когда оно поступит в скрипт, пхп сверяет его с тем, что было до этого, записывает данные в базу по золоту и генерирует новое число. Оно записывается в базу и генерируется в хмл. Флеш получает новое число и, когда юзверь хватает камешек, опять высылается инфа с новым секретным числом и так до бесконечия, пока игра не надоест нашему хакеру.

iNils
07.02.2008, 17:34
А программер забыл сказать, что перехвать можно не только передачу, но и прием?

romulko
07.02.2008, 18:34
Видимо, не забыл, а просто не сказал.

Стремная игрушка а сколько мороки.....

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

iNils
07.02.2008, 19:01
Перечитайте посты 2 и 4

divinus
07.02.2008, 19:16
я конечно дико извиняюсь господа флешеры, но почему все сразу забыли о старой доброй криптографии?
ведь можно использовать обычный открытый ключ, тогда проблема сужается до защиты флешки от "декомпиляции"

iNils
07.02.2008, 19:32
тогда проблема сужается до защиты флешки от "декомпиляции"Шыло на мыло.

divinus
07.02.2008, 19:55
iNils, ну в принципе да... только вот думается мне декомпилировать "защищенную" флешку, разобраться в алгоритме шифровки (который может быть сам по себе запутан до беспредела) и применять это для взлома игры смогут намноооого меньше человек чем просто подменять переменные в HTTP потоке...

iNils
07.02.2008, 20:08
А даже взламывать не обязательно.
В флейме как-то тема была, где попросили проверить защещеность одной флешки. __etc байткод разбирал, а я просто подгрузил флешку в другую флешку и путем подмены вычислил функцию которая принимала запросы и отдавала данные.
Тут точно также, пишите свою флешку, которая подгружает родную и использует ее функционал в своих целях.

Но в целом подход защиты серверных игр путем защиты swf не верен. Вы потратите море времени, а потом все равно поймете, что рулить должен сервер.

romulko
07.02.2008, 21:16
КОнечно, я внимательно прочитал посты Дениса, но, вот какие соображения у меня по этмоу поводу -



>> Все действия, которые делает юзер, должны отсылаться на сервер, где будет просчитана соответствующая логика.
Отправлять на сервер «юзер ткнул по такой-то вагонетке». А уж вытащил или нет — решает сервер, а не клиент.

Что мешает пользователю отсылать эти самые действия не из флешки?

†‡Paladin‡†
07.02.2008, 21:27
КОнечно, я внимательно прочитал посты Дениса, но, вот какие соображения у меня по этмоу поводу -



>> Все действия, которые делает юзер, должны отсылаться на сервер, где будет просчитана соответствующая логика.
Отправлять на сервер «юзер ткнул по такой-то вагонетке». А уж вытащил или нет — решает сервер, а не клиент.

Что мешает пользователю отсылать эти самые действия не из флешки?
Ничего не мешает. По этому принципу пишутся боты для mmorpg.

etc
07.02.2008, 22:47
Что мешает пользователю отсылать эти самые действия не из флешки?
Ничего. Но сервер все-равно контролирует приходящие данные.
Для реализации собственного хак-клиента потребуются ещё большие знания, чем простой взлом.

romulko
09.02.2008, 14:24
Простите, но я все равно не понимаю, как реализуется контролирование присылаемых данных от клиента сервер. В любом случае можно сделать анализ пересылаемых данных и, в конце-концов разгадать принцип.

Мне сегодня в голову пришла вот какая мысль – что, если пересылать данные в форме одной строки с 20-тью спонтанными числами. Например – 526497944…

Суть – флеш генерирует ненужные цифры, а в каких-то конкретных местах будут пересылаться нужные данные – например, 5-тый и 18 индексы будут говорить про то, сколько денег вытаскивает юзер. Пример –

Если он взял золото размером в 0.8 кредита, то число будет такое

8549 0 985465421652 8 65

Если вытаскивает алмаз (его стоимость 1), то

2164 1 6519784354984 0 31

На стороне сервера элементарный разбор этой строки и дальше действо идет в понятном направлении.

Такая логика имеет право на жизнь?

etc
09.02.2008, 14:31
Не имеет.

romulko
09.02.2008, 14:34
Почему?

iNils
09.02.2008, 16:51
Перечитайте все наши ответы внимательно еще раз.

feanarf
09.02.2008, 18:29
ну можно конечно как-то кодировать эту пересылку(например при отправке на сервер прибавлять к числу N умножать на 3 переводить цифры в буквы, к буквам прибавлять секретный пароль), на сервере производить обратное, и проверять, правилен ли пароль

iNils
09.02.2008, 19:11
feanarf, с добрым утром.

wvxvw
10.02.2008, 17:57
Флешка просто не должна знать в какой вагонетке золото или алмаз. Все, что она должна получить: количество вагонеток. А отправлять индекс вагонетки по которй кликнули. А сервер уже решит, что было в кликнутой вагонетке и в соответсвии с этим известит флешку о выиграше\проигрыше.

romulko
16.02.2008, 19:10
wvxvw, спасибо за пост. Наконец протверизвел и понял, о чем говорили уважаемые форумчане до этого.

В приложении логика процесса. Хотел бы добить этот вопрос хотя-бы для будущих флешеров (которые приходят с поиска). Пожалуйста, оставьте свои комментарии по поводу текста в архиве.

Спасибо всем за дискуссию.

LinuxVideo
16.02.2008, 21:02
Любая "игра на ловкость" обречена. Зависит только от желания "продвинутых геймеров". И зачастую это делают just for fun.

romulko
17.02.2008, 01:30
Конечно я понимаю, что поламать можно все, что угодно. Здесь вопрос стоит в максимальном уменьшении риска взлома, ничего больше.

P.S. Не думаю, что те, кто будут играть в нее захотят вникать в тонкости пхп и флеша, чтобы ломануть систему (в обиду никому не сказано).

LinuxVideo
17.02.2008, 03:12
> Конечно я понимаю, что поламать можно все, что угодно. Здесь вопрос стоит в максимальном уменьшении риска взлома, ничего больше.

Рисков нет. При "ломке" есть скорее азарт. Были даже такие игры, типа "вебломки" - просят ввести кучу паролей, которых никто не знает, но которые можно "сломать" :)


> Не думаю, что те, кто будут играть в нее захотят вникать в тонкости пхп и флеша, чтобы ломануть систему (в обиду никому не сказано).

У нас в локалке был набор игр. Люди играли. Потом кому-то захотелось прописать себя в первых местах таблиц рекордов. И он это сделал :). Если есть азарт - ничто не остановит ;)