Autor Zpráva
joe
Profil
Chtěl bych posílat serveru například nějaké skóre nebo výsledný čas, jak byste postupovali a z JavaScriptu ho odesílali? Nenapadá mě moc způsobů zabezpečení proti podvrhnutí.
Chamurappi
Profil
Reaguji na joa:
Viz Bezpečné odesílaní dat.
joe
Profil
Chamurappi:
Díky, tu diskusi si ještě trochu pamatuju a už předtím mi nedala moc spát a nic jsem nevymyslel. Ale řekl bych, že nějak to musí jít vyřešit :), s použitím nějakých šifrovacích algoritmů s privátním a veřejným klíčem by to nešlo? Skrýt privátní klíč v JS sice není kam, ale co kdyby byl platný jen po nějakou dobu. Případně jak to aspoň co nejvíce zesložitit, aby to případný útočník neměl tak jednoduché. V případě hry na čas odpadá možnost komunikace se serverem, protože by na výsledku mohla mít větší vliv doba příjmání požadavků a moc se mi takové řešení nelíbí...
Marek88
Profil
Podle mě nejlepší způsob popsal Chamurappi v tom odkazovaném vlákně hned v příspěvku #2. Bude ale dost záležet na typu hry. Pokud by se soutěžilo třeba v tom, kolikrát je člověk schopný kliknout myší za 10 sekund (něco takového jsem viděl jako aplikaci na FB), tak je postup hry docela jednoduché zfalšovat (prostě se vymyslí falešné časy kliknutí). Pokud by se ale jednalo o závodní hru (auta), tak se dají ukládat stisky kláves a z nich na serveru se znalostí trasy znovu spočítat, jak jel hráč rychle, kde boural atd. a z toho i celkový čas. Takovou věc už je ale velmi těžké podvrhnout...

Každopádně jakýmkoliv šifrováním nebo hashováním výsledků ale třeba i komprimováním JS kódu se podvržení výsledku dá pěkně znepříjemnit.
Chamurappi
Profil
Reaguji na joa:
s použitím nějakých šifrovacích algoritmů s privátním a veřejným klíčem by to nešlo?
Jakýkoliv algoritmus na straně klienta může poměrně snadno využít i útočník. Problém není v nešifrování komunikace, ale v tom, jakým způsobem jsou získávána zdrojová data. Někde v JS si řekneš „tak teď máš 47 bodů“ — a útočníkovi stačí napadnout tohle místo, změnit rozhodovací proces, který ke 47 bodům vedl, a zbývající činnost ponechat — pak je jedno, jak složitě to zabalíš a obhashuješ.

Jediné řešení je neúnosně zkomplikovat zdrojová data, tedy ponechat je v té nejsurovější podobě (zapsat celý herní postup) a zjistit jejich správný význam až na straně serveru. Pak má útočník při podvrhávání prakticky jedinou možnost — vyrobit si přímo umělou inteligenci, která odehraje danou hru celou za něj. Je-li hra příliš triviální, nemá cenu posílat někam výsledek a sestavovat žebříčky. Je-li složitější, pak si útočník, který opravdu dokáže napsat AI, zaslouží být první :-)
joe
Profil
Chamurappi:
Máš pravdu, ale pořád jsem přemýšlel nad tím, jestli nejde nějak udělat, aby se server rozhodl zda ten výsledek přijmout nebo ne.

Má se to dít na Facebooku, takže pokud by jeho api umožňovalo cokoli zašifrovat a na serveru rozšifrovat, myslím, že by bylo vyhráno :-) ale o žádné takové možnosti nevím, tak ať jsou chytří první :-)
Joker
Profil
joe:
Jak psal Chamurappi, šifrování na straně klienta nepomůže, prostě se hodnota podvrhne před tím šifrováním.

Ale mezi posíláním jen počtu bodů a posíláním celého postupu hrou (viz [#5]) existuje celá škála různě složitých „kompromisních“ řešení.

Když dám příklad, v nějakých situacích (třeba u hry rozdělené na úrovně to může být při přechodu mezi úrovněmi) by se na server odeslalo průběžné skóre a některé statistiky. Server pak může odchytit věci jako nereálně rychlý průchod úrovní, nereálné změny statistik a podobně.

Z toho by šlo nakombinovat řešení s vhodným poměrem náročnosti toho bezpečnostního mechanismu a odolnosti proti podvádění (100% odolnost proti podvodu zajistit nejde, ale postačí taková, že to podvádění nebude zajímavé).
joe
Profil
Joker & ostatní:

Díky za odpovědi. Ještě bych sem do tohoto tématu zanesl, jak to tedy dělat v případě, že se jedná o hru, kde asi nejde nijak odeslat postup = například "hry", kde jde o to, za jakou dobu uživatel vyplní nějaký dotazník a podobně.

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:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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