2011-01-19 8 views
12

Tak więc mam tę grę, która jest całkowicie uruchomiona na kliencie. Brak interakcji z serwerem, niezależnie od pobierania początkowych skryptów do gry. W każdym razie pod koniec gry chciałbym, aby klient odesłał mi wyniki, które powinny zostać zaktualizowane w bazie danych serwera. Teraz doszedłem do zaakceptowania faktu, że nie ma sposobu na ziemi, mogę ukryć to przed hakerem i wysłać wyniki niezmienione. Ale chciałbym wiedzieć, do jakiego poziomu mogę zmodyfikować cały proces, który praktycznie staje się niewykonalny, aby haker manipulował danymi, które są wysyłane. Na pewno nie chciałbym, aby wynik był wysyłany jako zwykły tekst z komputera klienta i nie chcę, aby mój serwer wykonywał złożony algorytm deszyfrowania. Jaki jest najlepszy sposób, aby osiągnąć znaczną część bezpieczeństwa, że ​​każdy tom dick i harry nie zhakują wyników ... Mam nadzieję, że ktoś mógłby zapewnić mi niezły sposób, że mógłbym pracować nad ... :) DziękiNajbezpieczniejszy sposób aktualizacji wyniku gry z bazy danych klienta do serwera? JavaScript

Zatem moim idealnym wynikiem powinien być -> zaufany wynik z obliczeń (wyniku) dokonanych przez niezaufaną drużynę (gracza)!

-Edit-

Ktoś powiedział mi coś o ukrywanie danych w obrazie dostać wniosek. Tak, wdrażam tę grę na płótnie (html5). Więc poprosił mnie na koniec gry, aby pobrać grę na obrazie z mojego serwera, a prośba powinna zawierać zakodowany wynik. Nie dokładnie rozumiałem cały proces, ale jeśli mógłbyś to wyjaśnić, byłbyś naprawdę zadowolony! :)

coda^więc można maskować żądań ładnie

shouvik jak mogę to zrobić !?

coda^możesz skomponować sumę kontrolną, którą chcesz przesłać. jak 12312312a12313a232 to twój md5, który zawiera wynik. przynieść składnika w płótnie jak

koda^server.com/images/md5_hash_of_score/congratulations.png

coda^które można przepisać stronie serwera za pośrednictwem htaccess

+0

Jest to mniej więcej ten sam problem, co http://stackoverflow.com/questions/1901352/preventing-cheating-in-online-chess-games. – Quentin

+0

@David, nie jest to całkiem inne! Nie mam żadnych problemów z tym, że on próbuje zepsuć moją grę, kiedy gra sam. Więc niech zrobi to, co, do cholery, chciałby. Jeśli pomieszał z punktacją, mam serwer adaptacyjny na moim serwerze, który sprawdza, czy wynik może być rozsądnie osiągnięty, jeśli nie UŻYTKOWNIK JEST ZABEZPIECZONY! Ale nie chciałbym, żeby to było łatwe, jak po prostu modyfikowanie posta ajaxowego ... – Shouvik

Odpowiedz

1

„Teraz doszedłem zaakceptować fakt, że nie ma sposobu na ziemi mogę ukryć tego od hakera i wysłać wyniki niezmienione.”

O tak, jest!

Można użyć RSA lub innej metody szyfrowania klucza publicznego (zwanej również kryptografią asymetryczną).

Utwórz zestaw kluczy (publicznych i prywatnych) dla serwera. Twój kod klienta musi zawierać klucz publiczny serwera.

Na końcu gry kod klienta, szyfruje wynik (za pomocą tego klucza) i wysyła oba (zwykły wynik i zaszyfrowany wynik) do serwera.

Serwer odszyfrowuje i sprawdza, czy zwykły wynik i odszyfrowany są takie same. Jeśli tak, zaakceptuj wynik. Jeśli nie, odrzuć (na środku jest błąd hakera lub sieci).

------- UPDATE ----------- KOREKTA --------------

Jak Ambrosia, wskazał, moje podejście nie udaje się całkowicie z tego rodzaju atakiem.

To, czego naprawdę chcesz, to mieć zaufany wynik z obliczeń (wyniku) dokonanych przez niezaufaną stronę (gracza). Nie ma łatwego sposobu, aby to osiągnąć.

Zobacz to: http://coltrane.wiwi.hu-berlin.de/~fis/texts/2003-profit-untrust.pdf

Również ten jeden: http://www.cse.psu.edu/~snarayan/publications/securecomputation.pdf

I (który potrzebuje subskrypcji biblioteki cyfrowej ACM): http://portal.acm.org/citation.cfm?id=643477.643479

+0

"nie chcę, aby mój serwer wykonywał złożony algorytm deszyfrowania" – Shouvik

+0

Tak, prawda. I "osiągnąć znaczną ilość bezpieczeństwa" w tym samym zdaniu. Dość sprzeczne, prawda? –

+0

Plus nie muszę płacić jak pieniędzy, aby korzystać z RSA? Chociaż musiałeś kupić te klucze? – Shouvik

0

można używać AJAX wysłać wynik (i wszelkie identyfikatory) na serwer? Jeśli nie mają czegoś takiego jak otwarty ogień, nie zobaczą, jak to się dzieje.

var url = '/savescores.asp?userID=fredsmith&score=1098'; 
createRequest(); 
request.open('GET', url, true); 
etc 
+0

Tak, wymyśliłem bit ajax. Ale zakładam, że mają konsolę otwartą. Jest to tylko kwestia zmiany parametrów adresu URL z konsoli podczas aktualizowania partytury, więc nie ma sposobu, żebym chciał, aby stało się to zbyt łatwe dla hakera. Może trochę bardziej skomplikowane, jak np. Stosowanie taktyki manipulacyjnej, która nie wymaga dużego nakładu pracy, to w zasadzie elementarne układanki, które mogą być rozwiązane przez serwer bez problemu. – Shouvik

0

Bądź klient wysłać poświadczenia (lub jakiś informacji o sesji w przypadku nie masz poświadczeń logowania) i zrobić to za pośrednictwem protokołu SSL (https). W ten sposób masz kontrolę zarówno autentyczności, jak i integralności. Bardzo łatwy i wyjątkowo lekki zarówno dla serwera, jak i klienta.

+0

Może przegapiłem dodawanie, ale ostatecznie skończy się na Facebooku :) – Shouvik

+0

Wysyłam identyfikator FB użytkowników z wynikiem. Nie sądzę, że wysłanie go przez ssl będzie miało znaczenie, ponieważ nie próbuję zapobiec atakowi środkowemu. Bardziej przypomina to, że zapobiegam atakującemu człowiekowi: D – Shouvik

+0

otrzymali ten adres https://ssl.facebook.com/, ale nie mam absolutnie żadnego doświadczenia z tym. Nie zdziwiłbym się, gdyby SSL nie działał na Facebooku. Co z kolei bardzo mnie denerwuje, ponieważ przekazują wszystkie dane osobowe i nigdy nie dbają o ochronę grrrrrrr! –

4

Wydaje się, że to już, ale tylko do naprężenie; nie można powstrzymać kogoś, kto to robi; możesz zrobić to tak mocno, jak to tylko możliwe!

Załóżmy obecnie przedstawić wynik jako:

/submit_score.php?score=5 

Ktoś ogląda w Firebug można łatwo odróżnić, gdzie wynik jest złożony, a żeby go zmieniać. submit_score.php podaje je, podobnie jak nazwę parametru. Wynik jest łatwą do odróżnienia liczbą całkowitą.

  1. Zmień punkt końcowy: /interaction.php?score=5
  2. Zmień nazwę parametru: /interaction.php?a=5

Jest coraz trudniej, aby użytkownik mógł się zorientować, co się dzieje.

Teraz możesz sprawić, że wynik będzie trudniejszy (ponownie, trudniejszy, nie niemożliwy), aby się zmienić. Po pierwsze, możesz go zaszyfrować (oczywiście będziesz musiał go później zdekodować).

  1. Baza 64 koduje to.
  2. Liczby -> Litery (1 = a, 2 = b, itp.).
  3. Odwróć kolejność reprezentacji wyniku.

Ty to nazwij, robisz to. Teraz masz interaction.php?a=e.

Następną rzeczą, którą możesz zrobić, to skasować wynik za pomocą czegoś innego. Wyślij wartość mieszającą z wynikiem i przelicz ją na serwerze.Na przykład, md5() wynik z losowym ciągiem i wysłać wynik (kodowany), łańcuch i hash w zgłoszeniu:

/interaction.php?a=e&str=abcde&hash=123456789abcefbc 

Jeżeli wniosek trafia do serwera, wykonaj następujące czynności:

if (md5($_GET['a'] . $_GET['str']) !== $_GET['hash']) exit; 

Oczywiście ludzie mogą (stosunkowo) łatwo przejrzeć kod JavaScript i zobaczyć, co się dzieje; więc utrudnij im to. Zminimalizuj i zaciemnij kod.

Jeśli sprawisz, że będzie wystarczająco ciężko dla kogoś, będą próbować zrozumieć twój JavaScript, spróbuj użyć Firebug, nie rozumiem, co się dzieje, i nie zawracaj sobie głowy; ze względu na zdobycie kilku dodatkowych punktów w grze.

+0

Dzięki za odpowiedź. Tak, jestem w pełni świadomy rzeczy, o których wspomniałeś. :) Zamierzam zaciemnić kod oczywiście do punktu nie do poznania: D To, co mnie bardziej interesuje, to znajomość w zasadzie wzorca chowania, aby naprawdę drażnić osobę, która gra mechanizm scoringowy w stopniu, w którym staje się niewykonalna. mu. Wysłałem to pytanie tutaj w nadziei, że będę mógł zbierać różne pomysły stąd, a następnie miksować je, aby ugotować własną odpowiedź, chociaż link do papieru podany przez @ypercube wydaje się być czymś, co może mi bardzo pomóc :) Dzięki jeszcze raz! – Shouvik