Skocz do zawartości

Zabezpieczanie pakietów


Hunter

Rekomendowane odpowiedzi

Witam, mam pytanie do biegle władających GML i używających 39dll. Otóż pewnie jak każdy robiący grę online zastanawiam się czy wysyłane do Klientów pakiety z serwera osoba trzecia może rozczytać i wysłać swoje dane. Bardzo chciałbym uniknąć takiej sytuacji, ażeby ktoś niepowołany nie dodawał sobie przywilejów w grze. A więc moje pytanie, czy normalne wysyłanie pakietów jest bezpieczne? Czy istnieją sposoby na zabezpieczenie ich? Jeśli tak to jakie? Proszę o odpowiedź.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

Jak zrobisz algorytm szyfrujący, to i tak jest szansa, że ktoś go rozszyfruje i stworzy własnego klienta, wysyłającego zmienne z przywilejami. Cały pic polega na tym, żeby najważniejsze rzeczy liczyć na serwerze:

 

- gdy gracz atakuje, sprawdzasz, czy nie robi tego zbyt często

- siłę ataku itd. obliczasz na podstawie zmiennych na serwerze

- exp, hp, mp trzymasz na serwerze i tam manipulujesz - do gracza wysyłasz je tylko informacyjnie, nigdy nie odbierasz ich od gracza - wtedy nawet jak zmodyfikuje RAM, poza tym, że będzie mu się wyświetlać więcej, nie ma żadnego zysku

- gdy gracz zmienia itemy, wysyłasz ID slotu w którym się znajdują, nie ID itemu - ID itemów są na serwerze, gracz ma je tylko informacyjnie, nawet jak zmieni sobie patyk na miecz, to serwer dalej będzie widział patyk i taki mu ustawi i dla takowego obliczany jest atak - zmienne u gracza powodują tylko wyświetlanie innej grafiki

- gdy gracz kupuje itemy, to sprawdzasz po stronie serwera czy go na nie stać, nawet jak w kliencie w RAMie zrobił sobie 1 000 000 000 złota, to na serwerze ma np. 100 i nie stać go na najlepsze itemy, więc serwer nie pozwoli na ich sprzedaż

- sprawdzasz jaką odległość przemieścił się gracz od ostatniego pakietu - jak podejrzani dużo, to ustawiasz mu pozycję na tą z serwera, lub od razu wyrzucasz z gry

- musisz zrobić wszystko tak, że nawet modyfikacja pamięci RAM i zmiennych na jakiekolwiek inne, nie zmienia na serwerze statystyk gracza, hp, mp, posiadanego złot

Odnośnik do komentarza
Udostępnij na innych stronach

Nie wiem czy dobrze zrozumiałem, ale chodzi o to aby robić taki myk ze kiedy np. gracz atakuje potwora wysyłać jedynie informacje na serwer ze została podjęta akcja ataku, wyliczać obrażenia na serwerze i dopiero je rozsyłać? To samo z resztą?

Jeśli chce coś zrobić z itemem, to wysyłam slot na serwer i porównuje z bazą danych ekwipunku gracza na serwerze ? Hm tylko właśnie przy tym trzeba by było przesłać ID playera, a to też chyba da się podmienić ;/

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chce coś zrobić z itemem, to wysyłam slot na serwer i porównuje z bazą danych ekwipunku gracza na serwerze ? Hm tylko właśnie przy tym trzeba by było przesłać ID playera, a to też chyba da się podmienić ;/
Po kij ci id playera :P ?

Przecież chyba wiesz, od kogo które dane dostajesz, no chyba, że to jakoś dziadosko napisałeś =d

 

Ogólnie to jest tak, jak powiedział gnysek, nie

Ej serwer, przesuń mnie na pozycje xy
i przesuwa, tylko
Panie Serwerze, mógłby mnie Pan przesunąć na pozycje xy?
A on sprawdza, czy może, i jak może, to przesuwa.

Podobnie z atakiem itepe.

Odnośnik do komentarza
Udostępnij na innych stronach

gdy chodzi o wymiane towaru to musi oznaczyc jakos gracza z ktorym wymiany dokonuje, wiec id nie jest przez "dziadowskie" napisanie

Odnośnik do komentarza
Udostępnij na innych stronach

@dawidds jesli powiesz mi jak bys zrobil rozrozniananie urzytkownika, jak przeprowadzac operacja na serwerze, nie majac zadnych danych ktorych moglbym wyszukac chociazby w tablicy graczy i obliczyc zycie tego gracza bez wysylu identyfikatora to bylbym niezwykle zaskoczony. ;] Bo ja nie mam zadnej koncepcji jak to mogloby dzialac bez przesylania danych bez id gracza ktorego dana operacja dotyczy. Mozlwe ze sie myle wiec pokaz jak ty bys to zrobil. ;]

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy
Nie wiem czy dobrze zrozumiałem, ale chodzi o to aby robić taki myk ze kiedy np. gracz atakuje potwora wysyłać jedynie informacje na serwer ze została podjęta akcja ataku, wyliczać obrażenia na serwerze i dopiero je rozsyłać? To samo z resztą?

Jeśli chce coś zrobić z itemem, to wysyłam slot na serwer i porównuje z bazą danych ekwipunku gracza na serwerze ? Hm tylko właśnie przy tym trzeba by było przesłać ID playera, a to też chyba da się podmienić ;/

 

Przecież info od gracza dostajesz na jego sockecie, żadnego ID być nie musi

Odnośnik do komentarza
Udostępnij na innych stronach

Pozwolę sobie odesłać Cię do przykładu/endżajnu: ;d

http://gmc.yoyogames.com/?showtopic=263183

 

Nie wiem, jak przechowujesz dane graczy (tablica/instancje), ale z socketem danego gracza i innymi informacjami o nich musisz wiązać też przecież jego id.

W przypadku wersji tablicowej np.

GML
player[0-15] = id playera na danym "slocie" (-1 jak wolne)

socket[idplayera] = socket gracza o danym id

hp[idplayera] = hp racza o danym id, itd.

Lub na instancjach:
GML
player[0-15] - to co wyzej, ale przechowuje id instancji (np. obj_client)

//I w obj_client przechowujesz sobie socket, i zamiast 1 wielkiej pętli w obj_server odbierac/wysylac informacje o wszystkich graczach, to w obj_client odbierasz/wysylasz dane

//odpowiedzalnie za konkretnie tego gracza, ktorego dotyczy obj_client</span>

Chociaż metodę przechowywania informacji o graczach możesz sobie zmienić zależnie od tego, jak Ci wygodniej.

 

I to, co (wersja z obj_client) dana instancja obj_client odbierze, wykonuje dla siebie (no, sprawdzając, czy to ma sens (kiedy ostatnio gracz atakowal, czy jak daleko się przesunął (to uwzględniając czas, który minął od jego ostatniej odpowiedzi)).

No i informacje typu siła ataku, typ itemu do zmiany (użycia/przesunięcia/itepe), hp czy level przechowujesz na serwerze - no ale to już gnysek napisał.

Odnośnik do komentarza
Udostępnij na innych stronach

Czyli jeśli dobrze zrozumiałem robić tak :

 

[create]

 

inicjowanie tablic graczy:

 

GML
for (i=0;i<25;i+=1)

{

global.player = -1;

}

 

przy dołączaniu :

 

GML
for (j=0;j<=25;j+=1)

{

if (global.player == -1)

{

global.player = socket//socket pod ktory podlancza sie gracz

break;

}

 

}

 

a przy przyjmowaniu danych wyszukujemy po prostu socket w tablicy? CZyli rozumiem ze wtedy mozemy zrezygnowac z wysylania ID gracza. Czy coś źle zrozumiałem?

A jeszcze jedno pytanko, co z nagłówkami ? Przecież je też można podmienić, no chyba że istnieje jakiś genialny sposób aby ominąć wysyłanie nagłówków, ale nie wydaje mi się.

Z góry dzieki, już sie zabieram za zmiany w wysyle.

Odnośnik do komentarza
Udostępnij na innych stronach

Ja osobiście preferuję tak:

GML
//obj_server

//Create

//zadelkarowanie tablicy player[15]

//Step

if(nowy gracz)

{

ok=0;

i=0;

repeat(maxplayers)

{

if(player == -1)

{

ok=1;

break;

}

i+=1;

}

 

if(ok)

{

ins = instance_create(0, 0, obj_client);

player = ins;

 

ins.playerid = i;

ins.socket = socketgraczaktorysiepodlaczyl;

}

else

{

//nie ma miejsca : (

}

}

 

//obj_client

//Step

//tutaj odbieranie ifnormacji od tego konkretnego gracza i odpowiednie reagowanie na nie</span></span>

 

I tak, w tablicy player (warto ją globalną zrobić) mamy sobie id instancji gracza na danym slocie - a numer indeksu tablicy jest właśnie tym id gracza.

I tak np. aby poznać hp gracza o id 7:

GML
player[7].hp

 

W obj_server dajemy globalne akcje typu podłączanie konkretnego gracza czy obsługa czatu, a w obj_client te dotyczące konkretnego gracza - czyli używanie itemów, poruszanie, atak itd.

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...