Autor Zpráva
Pavlínka
Profil
Zdravim, dělám takovou malou gamesku a chtěla bych zasílat informace POSTem na php, kde zapíše výsledek do databáze.
zabezpečení php je mi jasné ale jak zabránit tomu, aby script nešlo obejít a zaslat na server falešná data?
Děkuji za nápovědu
Keeehi
Profil
Pavlínka:
jak zabránit tomu, aby script nešlo obejít
Reálně to nejde. Můžeš to jen ztížit. Pak už jen záleží na tom, jak moc náročné překážky uděláš a jak moc znalý a jak moc ochotný ty překážky překonávat bude ten, kdo to bude chtít podvrhnout.
N71
Profil *
To je dost málo informací. Online hry mající ambici bojovat proti cheaterům zpracovávají typicky maximum dat na serveru. Takže například o tom, kdo koho trefil a zastřelí, rozhoduje server, ne klient.
JsonKody
Profil
Pavlínka:
bohuzel to nejde,
muzes zkusit vymyslet nejaky system, sifrovani apod.

Ale tvuj kod musi vedet jak to zasifrovat - tudiz to bude vedet i utocnik, pokud bude dost sikovny .. v podstate mu jen hazis vic a vic klacku pod nohy.
Hodne utocniku to zastavi protoze jim to treba nestoji za to nebo toho proste vedi malo ale pokud se najde extremne schopny utocnik, bude temer nemozne ho zastavit.

Napr. ale kdyz bych delal hru hada a implementoval do ni "replay"/"rewind" funkci .. tak ze kazdy pohyb a kazda zmena pozice "jidla" by se zaznamenala do nejake formy dat napr.:

// smer je anglicky: u, d, l, r -> up, down, left, right
// jidlo bude definovano polem se souradnicemi [x, y], pri kazdem snezeni se zobrazi nove souradnice
// dejme tomu ze pocet bodu je take zavisly na tom jak dlouho k jidlu hrac jede .. 
// v simulaci musi vse souhlasit - had musi sezrat vsechno jidlo az na to posledni samozrejmne

{
  velikost_hry: [20,20],
  pocatecni_pozice: [10,10],
  pocatecni_smer: 'r',
  pohyb: [12,'u', 22, 'r', 2, 'd', ...],
  jidlo: [[2,4],[17,14],[0,11],[13,14] ]
}

// PS: v mem hadovi se da prochazet stenami -> teleportuje se na druhou stranu, takze pohyb 22 neni spatne ;)

Kdyz mam tato data, muzu si hru v podstate pokazde nasimulovat a zjistim jestli to sedi nebo jestli je to podvrh.
Takze na server muzu misto score poslat tato data, server si provede simulaci a zjisti kolik bodu hrac ziskal.
Nevyhoda je ze je to mnohem slozitejsi na implementaci nez proste poslani score.

Vyhoda je ze hraci se mohou podivat na replaye sve i ostatnich, ale hlavne ze pokud se nekdy rozhodnu ze zmenim algoritmus pro ziskavani bodu, neznici mi to tabulku nejlepsich hracu, protoze jejich nove score zjistim novou simulaci hry ;)


dalsi klacek (velmi jednoduchej ale taky ne moc slozitej na obejiti) by bylo zakodovat string tohoto JSONu nejak takto:

const str = JSON.stringify( mujObj )

// -> '{"velikost_hry":[20,20],"pocatecni_pozice":[10,10],"pocatecni_smer":"r","pohyb":[12,"u",22,"r",2,"d"],"jidlo":[[2,4],[17,14],[0,11],[13,14]]}'

btoa( str )

'eyJ2ZWxpa29zdF9ocnkiOlsyMCwyMF0sInBvY2F0ZWNuaV9wb3ppY2UiOlsxMCwxMF0sInBvY2F0ZWNuaV9zbWVyIjoiciIsInBvaHliIjpbMTIsInUiLDIyLCJyIiwyLCJkIl0sImppZGxvIjpbWzIsNF0sWzE3LDE0XSxbMCwxMV0sWzEzLDE0XV19'

kdyz toto poslu na server, je velmi jednoduche to slozit zpet na JSON, ale jednoduche to bude i pro zkuseneho utocnika .. je to jen dalsi prekazka na ktere hloupejsi utocnik ztroskota.

Dale se da tento string treba asymetricky zasifrovat ale opet, bude potreba mit v aplikaci nekde public key, tim padem to dokaze stejne zasifrovat i utocnik.

Je to nekonecny boj a posouvani hry na vyssi uroven :/


hlavni vyhoda poslani dat v takovym divnym stringu je ze kdyz se utocnik podiva do devtools na volani serveru, uvidi jako payload jen takovyhle divny mishmash a pokud ho jeste zasifrujes, mozna se celkem zapoti nez to dokaze rozlousknout - rozsifrovat to nedokaze bez privat klice ktery je jen na serveru. Bude se muset podivat co to ten kod vlastne zasifroval a jak to funguje, a jak to nafejkovat atd. Kod muze byt (mel by byt) minifikovany, takze misto nazvu funkci tam bude treba a(j, k), q(k) atd.


PS: muzes si vymyslet nejaka vlastni pravidla pro validaci .. treba ze score bude ve formatu
n = cislo, X = validacni prvek

nXXXnnnn...

ze na druhe, treti a ctvrte pozici pridas validacni prvek a ten prvni musi byt napr. delitelny trema, druhy ctyrma a treti dvema. Treba :)

Ja nejsem kryptograf, urcite na webu najde nejake mnohem lepsi vychytavky, tohle jsem si ted doslova vycucal z prstu xD, ale taky by to fungovalo, jako jednoducha slabsi ochrana

score 21 by se zmenilo na 26841
score 1280 na 1946280

score 9999999 by nefungovalo

Tohle je jen super easy napad na validaci toho cisla, urcite existuji nejake opravdu matematicke a sikovne zpusoby ;)
Problem je ze na webu utocnik vzdy ma pristup k tomu co na klientovi delas, takze chytry utocnik se podiva copak s tim score provadis a muze to obejit.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0