Hunter Opublikowano 16 Listopada 2009 Udostępnij Opublikowano 16 Listopada 2009 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 Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 16 Listopada 2009 Administratorzy Udostępnij Opublikowano 16 Listopada 2009 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 Więcej opcji udostępniania...
Hunter Opublikowano 16 Listopada 2009 Autor Udostępnij Opublikowano 16 Listopada 2009 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 Więcej opcji udostępniania...
Dawidds Opublikowano 17 Listopada 2009 Udostępnij Opublikowano 17 Listopada 2009 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 xyi przesuwa, tylkoPanie 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 Więcej opcji udostępniania...
PsichiX Opublikowano 17 Listopada 2009 Udostępnij Opublikowano 17 Listopada 2009 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 Więcej opcji udostępniania...
Dawidds Opublikowano 17 Listopada 2009 Udostępnij Opublikowano 17 Listopada 2009 Z tego co on napisał, to on nie jest w stanie "od razu" rozpoznać, od kogo (id playera) dostał daną wiadomość - a jeśli tak jest to jest "dziadosko napisane". "dziadosko napisane" jest, jeśli właśnie nie jest w stanie sam określić id gracza. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Hunter Opublikowano 17 Listopada 2009 Autor Udostępnij Opublikowano 17 Listopada 2009 @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 Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 17 Listopada 2009 Administratorzy Udostępnij Opublikowano 17 Listopada 2009 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 Więcej opcji udostępniania...
Dawidds Opublikowano 17 Listopada 2009 Udostępnij Opublikowano 17 Listopada 2009 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 Więcej opcji udostępniania...
Hunter Opublikowano 17 Listopada 2009 Autor Udostępnij Opublikowano 17 Listopada 2009 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 Więcej opcji udostępniania...
Dawidds Opublikowano 17 Listopada 2009 Udostępnij Opublikowano 17 Listopada 2009 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę