Asus Rampage III Extreme - Intel Core i7 960 3.2GHz @ 4.09GHz - 12GB G.Skill F3 @ 1723MHz - Club3D HD5970 2GB - Cooler Master V6 GT - Samsung Syncmaster P2770H - Cooler Master HAF 922 - Corsair HX850W - SSD Samsung 830 series 256GB - 2x 1TB HDD Raid0
Onderwerpen
When I get sad i stop being sad and be awesome instead
SSL beschermd alleen tussen client en server, het probleem is dat de client de gegevens aanpastquote:
Wikipedia: Security through obscurityquote:om3ega schreef op dinsdag 13 maart 2012 @ 22:59:
Misschien niet alleen het aantal zetten versturen maar een ingewikkeld gegenereerde string waarbij je aan de server kant het aantal zetten er weer uit filtert ofzo?
Kwastie wijzigde deze reactie 13-03-2012 23:01 (43%)
When I get sad i stop being sad and be awesome instead
Mijn Tweakblog en zoeken in Tweakblogs
Underclocken is cool - Phenom II X4 955 (3.2GHz) @ 800MHz!
Reg. datum: 30-01-2006
Tekoop: Tacx t2600 met Tacx band, pm voor meer info!
_@/' _@/' _@/' _@/' _@/' _@/' _@/' _@/' _@/' _@/' _@/' _@/' _@/'? '\@_
In dit geval een niet eens zo heel onwaarschijnlijke optie, want:
- bedenk wat je doelgroep is. Algemeen publiek met nul IT verstand, of scriptkiddies? Indien de eerste, is het de moeite dan wel?
- Aangenomen algemeen publiek: mocht er een scriptkiddie aan de slag gaan en het algemeen publiek ziet die scores, dan kunnen die dat natuurlijk ook als een motivatie zien om nog meer te spelen. Het heet niet voor niets een ranking, zo werkt het nou eenmaal. Wel zorgen dat je een top20 oid maakt, of iig eentje waarbij men zichzelf relatief snel terug kan zien
- Achteraf kun je iets dergelijks altijd nog inbouwen
Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)
Als je een stappenplan hebt lijkt het me idioot veel werk om dat naar de server te gaan sturen, gewoon spelen is waarschijnlijk sneller. Ook een efficient stappenplan berekenen gaat waarschijnlijk aardig wat tijd kosten, ik heb ooit eens een zeer simpel spelletjes geprobeerd te brute-forcen, en toen bleek mn pc al niet voldoende geheugen daarvoor te hebben.quote:jostefa schreef op dinsdag 13 maart 2012 @ 23:03:
Dan kunnen ze toch alsnog een fake stappen plan uploaden die wel geldig is
Mijn Tweakblog en zoeken in Tweakblogs
Underclocken is cool - Phenom II X4 955 (3.2GHz) @ 800MHz!
Je 2e variabele is een bool met het antwoord op de vraag of ze de score op willen slaan.
If bool true then highscore = variabele
Om je score ingame weer te geven leest de client de variabele uit.
Je moet je game wel zo programmeren dat de server bepaald of de score omhoog gaat (dus de client stuurt input naar de server, server output volgende spelsituatie) en niet dat het spelletje compleet client-side is, en pas communiceert met de server op het moment dat de game over is.
Dat is veilig genoeg voor een simpel spelletje.
TheS4ndm4n
Reg. datum: 06-04-2009
Ik snap niet echt wat je probeert uit te leggen, laat staan dat het relevant is voor dit topic, laat staan dat het steek houdt...quote:RocketKoen schreef op woensdag 14 maart 2012 @ 01:02:
Houdt de score bij serverside, en declare die variabele als private. (weet niet hoe het in javascript precies zit, maar ik neem aan dat dit kan)
Je 2e variabele is een bool met het antwoord op de vraag of ze de score op willen slaan.
If bool true then highscore = variabele
Om je score ingame weer te geven leest de client de variabele uit.
OP vraagt hoe hij kan voorkomen dat mensen een fake score uploaden, en jij begint over variabelen op 'private' zetten?
Dat is wat ik graag zou willen maar ben er nog niet helemaal achter hoe ik dit moet aanpakkenquote:Kwastie schreef op dinsdag 13 maart 2012 @ 22:21:
Alle gegevens bijhouden op de server (dus je speelt het spel eigenlijk op de server. De client ziet alleen de output)
Dat heeft natuurlijk geen nut. Ik kan ook een post maken naar een server dat over een SSL lijntje gaat.quote:
Wat aan de client ge-encrypted moet worden kan ook gedaan worden door een scriptkiddiequote:om3ega schreef op dinsdag 13 maart 2012 @ 22:59:
Misschien niet alleen het aantal zetten versturen maar een ingewikkeld gegenereerde string waarbij je aan de server kant het aantal zetten er weer uit filtert ofzo?
Dat gaat moeilijk, ik zal je later uitleggen waarom (staat helemaal onderaan beschreven, het spel kan op zoveel verschillende manieren uitgespeeld worden).quote:dcm360 schreef op dinsdag 13 maart 2012 @ 23:01:
Niet de score opsturen maar de gemaakte zetten (en eventueel dus de beginstaat). Vervolgens kan je op de server beredeneren of dit een geldig spel was.
Ik heb hier inderdaad niet de doelgroep te pakken die veel van dit soort zaken af weet. Echter is dit geen reden om het alsnog niet te beveiligen. Ook mensen die er wel verstand van hebben komen wel eens op dit soort websites om even de entertainment op te zoeken, om er vervolgens achter te komen dat de highscores makkelijk aan te passen zijn.quote:The Eagle schreef op dinsdag 13 maart 2012 @ 23:12:
Er is altijd optie 1: niets doen
In dit geval een niet eens zo heel onwaarschijnlijke optie, want:
- bedenk wat je doelgroep is. Algemeen publiek met nul IT verstand, of scriptkiddies? Indien de eerste, is het de moeite dan wel?
- Aangenomen algemeen publiek: mocht er een scriptkiddie aan de slag gaan en het algemeen publiek ziet die scores, dan kunnen die dat natuurlijk ook als een motivatie zien om nog meer te spelen. Het heet niet voor niets een ranking, zo werkt het nou eenmaal. Wel zorgen dat je een top20 oid maakt, of iig eentje waarbij men zichzelf relatief snel terug kan zien
- Achteraf kun je iets dergelijks altijd nog inbouwen
Of ik de variabelen nu private maak of niet, er zal uiteindelijk een post naar de server gedaan moeten worden. En die kan iedereen maken of je de variabelen nu private maakt of niet.quote:RocketKoen schreef op woensdag 14 maart 2012 @ 01:02:
Houdt de score bij serverside, en declare die variabele als private. (weet niet hoe het in javascript precies zit, maar ik neem aan dat dit kan)
Je 2e variabele is een bool met het antwoord op de vraag of ze de score op willen slaan.
If bool true then highscore = variabele
Om je score ingame weer te geven leest de client de variabele uit.
Je moet je game wel zo programmeren dat de server bepaald of de score omhoog gaat (dus de client stuurt input naar de server, server output volgende spelsituatie) en niet dat het spelletje compleet client-side is, en pas communiceert met de server op het moment dat de game over is.
Dat is veilig genoeg voor een simpel spelletje.
Het betreft een spel waarbij er een achtergrond in puzzelstukjes wordt verdeeld. Deze stukjes worden random geplaatst op een veld waarbij er 1 wordt weggelaten. Het is aan de gebruiker om alle stukjes weer op de juiste plaatst te krijgen door de blokjes naast het lege veld naar het lege veld te schuiven en zo een nieuw leeg veld te creëren en zo steeds dichter bij het originele afbeelding te komen.
Dat houdt in dat:
- De stappen/zetten die je maakt vrij snel kunnen gaan.
- Er een variabele tijd is voor het uitspelen van het spel.
- Er (zeer) moeilijk van te voren kan worden bepaald hoeveel stappen er minimaal moet worden gezet.
Ik dacht aan een een unieke key voor elk uniek spel voor elke # stappen. Alleen dan krijg je weer problemen met andere dingen.
Iemand nog een briljant idee?
ZeroXT wijzigde deze reactie 14-03-2012 08:17 (5%)
Asus Rampage III Extreme - Intel Core i7 960 3.2GHz @ 4.09GHz - 12GB G.Skill F3 @ 1723MHz - Club3D HD5970 2GB - Cooler Master V6 GT - Samsung Syncmaster P2770H - Cooler Master HAF 922 - Corsair HX850W - SSD Samsung 830 series 256GB - 2x 1TB HDD Raid0
Redelijk wat fruit speelgoed, paar vps'en en nog wat wat andere zut.
Je kan alsnog de score op de server berekenen toch?quote:ZeroXT schreef op woensdag 14 maart 2012 @ 08:12:
Dat houdt in dat:
- De stappen/zetten die je maakt vrij snel kunnen gaan.
- Er een variabele tijd is voor het uitspelen van het spel.
- Er (zeer) moeilijk van te voren kan worden bepaald hoeveel stappen er minimaal moet worden gezet.
Ik dacht aan een een unieke key voor elk uniek spel voor elke # stappen. Alleen dan krijg je weer problemen met andere dingen.
Iemand nog een briljant idee?
Spel aanmaken op server, sla dit op met startdatum en je geeft een spel ID met puzzel terug .
Gebruiker doet zijn spelletje, jij slaat alle gedane zetten op (gewoon array van indexen van de verschoven stukjes)
Bij voltooid verstuurd client het ID en de gedane zetten naar de server.
Jij kan op de server via de zetten controleren of daar de goede afbeelding uitkomt, en weet hoe lang hij er over heeft gedaan. Jij kan dan de score berekenen op de server.
Willen ze het handmatig veranderen dan moeten ze voor het specifieke id een juiste array genereren waar een goede afbeelding uit komt.
Heb je ooit een debugger (of Firebug/Chrome Devtools/etc.) bekeken?quote:RocketKoen schreef op woensdag 14 maart 2012 @ 01:02:
Houdt de score bij serverside, en declare die variabele als private. (weet niet hoe het in javascript precies zit, maar ik neem aan dat dit kan).
Je 2e variabele is een bool met het antwoord op de vraag of ze de score op willen slaan.
If bool true then highscore = variabele
Ik sluit me aan bij dcm360 e.d. Gewoon de zetten doorsturen en server-side deze zetten doorrekenen en controleren of de uitkomst valide is en daar een score aan toekennen. Ja, men kan een "bot" gebruiken om aan de zetten te komen maar daar heb je dan ook alles mee gehad; scores faken kan niet en een bot is (afhankelijk van 't spelletje natuurlijk) niet zo gemaakt. En dan nog; wat als een bot een hogere score dan een mens verdient? Dat is IMHO ook punten waard
RobIII wijzigde deze reactie 14-03-2012 09:17 (45%)
Liposuction will destroy your FAT
Trotse papa van Luca en Danu! | Pick My Icon!
Reg. datum: 06-12-2002
500 zetten in 1 seconde zou bijvoorbeeld een mogelijke valsspeler zijn, ik noem maar wat
- De meesten zullen het doen door het aanpassen van de Post mbv. tools als firebug.
- Script kiddies met wat meer geduld zullen wat verder gaan kijken en variabelen of javascript code aanpassen / doorzoeken.
De eerste methode is redelijk eenvoudig aan te pakken: zorg dat de score op een of andere manier geencrypt wordt. Dit zal 80% van de cheaters tegen houden, want zij missen vaak de technische kennis om verder te gaan kijken.
De tweede methode wordt al wat lastiger. Doordat je game zich afspeelt op de client kan, in theorie, een cheater aanpassen wat hij wilt. Hij kan zijn score verhogen of uitzoeken hoe hij zelf een score kan encrypten en alsnog de Post aanpassen. Het enige wat je hiertegen kunt doen is het de cheater moeilijker maken, door bijvoorbeeld:
- Javascript te obfuscaten
- Checks in te bouwen die controleren op verdacht gedrag (bijvoorbeeld controleren of de score niet plots met 200 verhoogt wordt).
Je zult ook daarmee wat cheaters tegen houden (het wordt meer werk voor een cheater om dat uit te gaan zoeken), maar de die hards zullen niet opgeven en uiteindelijk wel een methode vinden om ook dat te omzijlen.
Wat je dan bereikt hebt is Security through obscurity (zoals Kwastie al postte).
De enige manier om je game dus echt 100% cheat-vrij te maken is, zoals al vaker aangegeven, door het verplaatsen van logica naar je server. Dit gaat echter wat ingrijpende wijzigingen vereisen in je game, dus het is de vraag hoeveel moeite je hiervoor wilt doen. Een voorbeeld die al genoemd is, is het op de server valideren van elke stap die een speler doet.
Het houdt de meeste scriptkiddies wel tegen, en in de context van deze game voldoet dat prima. Het is niet de beveiliging van het Pentagon immers.quote:Zoijar schreef op woensdag 14 maart 2012 @ 09:04:
Enige veilige manier is alles op de server bijhouden. En anders is wat Boudewijn zegt een redelijke oplossing. Encryptie voegt niks toe.
Tuurlijk zijn er altijd veiligere methodes, maar je moet dingen imho wel binnen de scope van een project blijven zien en op dat nivo beslissen wat 'veilig' zat is. Zolang het een spelletje puur ter entertainment is, is een relatief eenvoudige beveiliging op basis van encryptie al dan niet met een wisselende sessie gestuurde key afdoende. Gaat het hier om het winnen van prijzen, dan ben je beter af met een client/server implementatie waar de meeste gamelogica server side wordt afgehandeld.
Redelijk wat fruit speelgoed, paar vps'en en nog wat wat andere zut.
Kortom; gewoon serverside gaan regelen, de input die je aan de clientside doet, serverside valideren. Nou is niet ieder spelletje daarvoor geschikt natuurlijk.
Encryptie is echt niet veilig. Dat is een kwestie van een variabele, de score, wijzigen in een debugger en weer op run drukken. Hoef je niet eens te weten hoe die hele encryptie werkt. Je moet gewoon goede code afleveren als je iets maakt. Dit is precies de instelling waarom al die webwinkels etc. nu steeds gehackt worden.quote:kwaakvaak_v2 schreef op woensdag 14 maart 2012 @ 10:35:
Het houdt de meeste scriptkiddies wel tegen, en in de context van deze game voldoet dat prima. Het is niet de beveiliging van het Pentagon immers.
Tuurlijk zijn er altijd veiligere methodes, maar je moet dingen imho wel binnen de scope van een project blijven zien en op dat nivo beslissen wat 'veilig' zat is. Zolang het een spelletje puur ter entertainment is, is een relatief eenvoudige beveiliging op basis van encryptie al dan niet met een wisselende sessie gestuurde key afdoende. Gaat het hier om het winnen van prijzen, dan ben je beter af met een client/server implementatie waar de meeste gamelogica server side wordt afgehandeld.
Alle stappen client-side opslaan en doorsturen naar de server voor validatie aan het einde van het spel is een redelijke beveiliging met afweging tussen implementatie gemak, bandbreedte en veiligheid. Anders idd met ajax elke stap doorsturen naar je server en bijhouden. Daarvan kan ik me voorstellen dat het overkill is voor een spelletje.
En wat weerhoud de hacker om gewoon andere stappen door te sturen?quote:Zoijar schreef op woensdag 14 maart 2012 @ 12:13:
[...]
Encryptie is echt niet veilig. Dat is een kwestie van een variabele, de score, wijzigen in een debugger en weer op run drukken. Hoef je niet eens te weten hoe die hele encryptie werkt. Je moet gewoon goede code afleveren als je iets maakt. Dit is precies de instelling waarom al die webwinkels etc. nu steeds gehackt worden.
Alle stappen client-side opslaan en doorsturen naar de server voor validatie aan het einde van het spel is een redelijke beveiliging met afweging tussen implementatie gemak, bandbreedte en veiligheid. Anders idd met ajax elke stap doorsturen naar je server en bijhouden. Daarvan kan ik me voorstellen dat het overkill is voor een spelletje.
Je kan al veel scriptkiddies buiten houden met een encryptie systeem, met evt nog een salt. Bijvoorbeeld dat je in het begin een secret key vraagt, deze opslaat in je sessie. Op het moment dat je je score wilt submitten encrypt je je score + secret key en serverside valideer je of deze overeenkomen.
Nee, dit is niet 100% theoretisch hufterproof. Maar uiteindelijk zijn vrijwel elke beveiliging methodes te kraken, dan niet nu of in de toekomst. Je moet natuurlijk ergens beginnen, het is al een stuk beter dan niets.
Reg. datum: 15-04-2005
Stel dat je clientside alle stappen van de oplossing bijhoud, en dan bij het sturen van de score ook de gehele oplossing meestuurt, kan de server daarna valideren of de oplossing "klopt", voordat het de score accepteert. (dit werkt niet voor alle gametypes).
Al de rest (SSL, obfuscation, salt, unieke codes) zijn omzeilbaar.
Desondanks is de grote vraag, wil je het echt beveiligen? Zo ja, doe het dan goed, zo nee, doe het dan niet
-niks-
Dan geef je ze de hoofdprijs omdat ze een bot geschreven hebben die het spel op de meest optimale manier uitgespeeld heeft?quote:jostefa schreef op dinsdag 13 maart 2012 @ 23:03:
Dan kunnen ze toch alsnog een fake stappen plan uploaden die wel geldig is
Hier ben ik het dus pertinent niet mee eens. Ookal is een beveiliging bewezen om te zeilen vind ik dat je hem nogsteeds kan toepassen. Ten eerste omdat het verdomt moeilijk is om iets te verzinnen wat totaal niet te omzeilen is, ik ken er in ieder geval geen welke theoretisch(!) onmogelijk is om te kraken. Je bent het gewoon erg moeilijk aan het maken om het systeem te omzeilen, door verschillende technieken toe te passen. Natuurlijk prefereer je 'betere' technieken, maar een combinatie van oplossingen zorgt ervoor dat het net wat lastiger word om je beveiliging ongedaan te maken.quote:MLM schreef op woensdag 14 maart 2012 @ 14:48:
Al de rest (SSL, obfuscation, salt, unieke codes) zijn omzeilbaar.
Desondanks is de grote vraag, wil je het echt beveiligen? Zo ja, doe het dan goed, zo nee, doe het dan niet
En het lijkt ook de menig te zijn van vrijwel alle grote software developers. Ookal is Windows XP tot in de verdoemtenis gecrackt blijven ze wel een vorm van beveiliging installeren.
TJHeuvel wijzigde deze reactie 14-03-2012 15:03 (8%)
1) je hebt een computer (server) waar alleen jij code op kan uitvoeren
2) je kan alle game-variabelen op de server bewaren, en alleen het minimale noodzakelijke doorgeven aan de client
(dit gaat op voor vele client/server architecturen, bijvoorbeeld World of Warcraft)
Vergelijk met Windows XP (en bijv Photoshop, singleplayer games etc.)
1) alle (machine) code staat op de client, en die is vrij te bewerken (immers, je kan op je HDD)
2) alle variabelen staan op de client (immers, windows moet ook starten als er geen internet is)
Alleen met de developer tools die ingebouwd zijn in chrome, kan je al het volgende:
- omzeilt alle HTTPS/SSL, immers je ziet alle requests en responses voor encryptie langskomen
- omzeilt alle salt/unieke ID, immers die zie je gewoon langskomen (net als hierboven)
Het enige wat een beetje helpt hier (tegen amateurs) is obfuscation, gebruik van een niet-standaard "encryptie" (XOR met een constante komt bij me op
Mijn punt is, alle "pruts" beveiligingen houden het echt niet lang vol tegen een hacker. Zelfs als het geimplementeerd word door professionele developer-teams (zoals jouw voorbeeld van WinXP) is het gewoon kansloos als er vraag naar een hack is.
-niks-
1. Het beveiligen van het opsturen van high-scores
2. Het beveiligen van het uitspelen van het spelletje (op een eerlijke manier)
1) is prima onomzeilbaar te beveiligen met serverside validatie, 2) niet, en al helemaal niet door encryptie, salts, challenges of wat dan ook.
masq wijzigde deze reactie 14-03-2012 15:49 (10%)
Punt 2 kun je wel grotendeels beveiligen door elke stap/klik in het spel naar de server te sturen voor controle.quote:masq schreef op woensdag 14 maart 2012 @ 15:38:
Volgens mij halen mensen hier twee dingen door elkaar waardoor er wat verwarring ontstaat:
1. Het beveiligen van het opsturen van high-scores
2. Het beveiligen van het uitspelen van het spelletje (op een eerlijke manier)
1) is prima onomzeilbaar te beveiligen met serverside validatie, 2) niet, en al helemaal niet door encryptie, salts, challenges of wat dan ook.
Je weet dan dat de speler in elk geval het hele spel doorlopen heeft. Het is natuurlijk nog wel mogelijk om een bot te maken die het spel voor je speelt, maar voor 99% van de script kiddies is dat te veel werk.
Het feit dat server controlleert of het stappenplan klopt. Je zal dus sowieso een correcte oplossing moeten sturen. Hoe je die verkrijgt is een tweede. Als het gaat om het minimale aantal zetten bijvoorbeeld, dan kan je dit berekenen met een bot die het spel doorrekent (wat al behoorlijke kennis van het spel aangeeft), maar zo'n programma zou je dan altijd kunnen gebruiken en de stappen gewoon in het spel zelf doen (schaken met een schaakcomputer ernaast). Verder valt er weinig te hacken. Tenzij er nog extra scores zoals tijd worden bijgehouden. Dan kan je het stappenplan bijvoorbeeld versnellen.quote:TJHeuvel schreef op woensdag 14 maart 2012 @ 14:39:
En wat weerhoud de hacker om gewoon andere stappen door te sturen?
En dan staat de javascript of flash variabele "score" ergens, break-point erop, aanpassen aan het einde van het spel, en weer runnen. Je kan het wel ontzettend moeilijk gaan obfuscaten, maar uiteindelijk is het amper/geen beveiliging.quote:Je kan al veel scriptkiddies buiten houden met een encryptie systeem, met evt nog een salt. Bijvoorbeeld dat je in het begin een secret key vraagt, deze opslaat in je sessie. Op het moment dat je je score wilt submitten encrypt je je score + secret key en serverside valideer je of deze overeenkomen.
Server state is niet te kraken, tenzij je de server zelf kan hacken, of er een fout in je implementatie zit. Hoeveel World of Warcraft unlimited gold en experience hacks zijn er?quote:Nee, dit is niet 100% theoretisch hufterproof. Maar uiteindelijk zijn vrijwel elke beveiliging methodes te kraken, dan niet nu of in de toekomst. Je moet natuurlijk ergens beginnen, het is al een stuk beter dan niets.
Wat betreft (1), waarom zou jet opsturen willen beveiligen? Zodat iemand anders niet jouw score kan zien bij de ISP of als man-in-the-middle? Wat heb je daar aan? Doe dan gewoon een SSL verbinding.quote:masq schreef op woensdag 14 maart 2012 @ 15:38:
Volgens mij halen mensen hier twee dingen door elkaar waardoor er wat verwarring ontstaat:
1. Het beveiligen van het opsturen van high-scores
2. Het beveiligen van het uitspelen van het spelletje (op een eerlijke manier)
1) is prima onomzeilbaar te beveiligen met serverside validatie, 2) niet, en al helemaal niet door encryptie, salts, challenges of wat dan ook.
Reg. datum: 06-04-2009
Wat maakt valsspelen nu uit op een clientside only game?quote:masq schreef op woensdag 14 maart 2012 @ 17:29:
Wat ik bedoel is dat het voorkomen van submitten van willekeurige high-scores iets anders is dan het voorkomen van valsspelen in het algemeen.
Lijkt me niet de ontwikkelaar zijn grootste zorg...
Uiteindelijk is het spoofen van high-scores toch ook een vorm van valsspelen?
- Bij elke zet, de positie van het lege vak naar de server sturen.
- Op de server controleren welke vakken er dan op dat moment mogen bewegen
- De array opbouwen met de zetten die zijn gemaakt.
- Aan het einde, wanneer de highscore wordt geupload, de array met zetten meesturen en controleren op de server of deze geldig zijn.
Asus Rampage III Extreme - Intel Core i7 960 3.2GHz @ 4.09GHz - 12GB G.Skill F3 @ 1723MHz - Club3D HD5970 2GB - Cooler Master V6 GT - Samsung Syncmaster P2770H - Cooler Master HAF 922 - Corsair HX850W - SSD Samsung 830 series 256GB - 2x 1TB HDD Raid0
Waarom bij elke zet?quote:ZeroXT schreef op woensdag 14 maart 2012 @ 19:11:
Er zijn maximaal 4 blokjes die mogen bewegen per keer. Dus wat ik moet doen is:
- Bij elke zet, de positie van het lege vak naar de server sturen.
Als je de beginstaat bijhoudt (of ook doorgeeft) dan kan je met een reeks zetten de boel helemaal narekenen. Je hoeft die zetten dus alleen bij het opsturen van de highscore door te geven.
Die score kan je dan als het goed is terwijl je de zetten narekent/controleert opnieuw aan je serverzijde doorrekenen en die berekende highscore (als alles klopt) sla je uiteindelijk op.
Saai uitzicht in je tuin? Hang er een foto voor!
-niks-
En hoe zorg je ervoor dat de stappen die je opstuurt niet aangepast worden door de hackerquote:Zoijar schreef op woensdag 14 maart 2012 @ 16:34:
[...]
Het feit dat server controlleert of het stappenplan klopt. Je zal dus sowieso een correcte oplossing moeten sturen.
Amper beveiliging is ook beveiliging. Uiteindelijk is alles te omzeilen, dus elk klein beetje helpt. Hetzelfde zou te zeggen zijn over het gebruik van IsDebuggerPresent in Windows applicaties, of een simpel hangslotquote:En dan staat de javascript of flash variabele "score" ergens, break-point erop, aanpassen aan het einde van het spel, en weer runnen. Je kan het wel ontzettend moeilijk gaan obfuscaten, maar uiteindelijk is het amper/geen beveiliging.
Je zou het kunnen vergelijken met een ketting om je fiets heen binden. Natuurlijk kan je met een ijzerzaag hier doorheen zagen, iedereen kan dat, iedereen weet dat. Maar je doet het toch omdat het al een heel stuk langer duurt voor de dief om je fiets mee te nemen.
Server state is weldegelijk te kraken, alles is te kraken. Misschien niet voordehandliggend, en wellicht niet eens jouw schuld. Waarom zou je server niet overgenomen kunnen worden door een lek, er zijn er genoegquote:Server state is niet te kraken, tenzij je de server zelf kan hacken, of er een fout in je implementatie zit. Hoeveel World of Warcraft unlimited gold en experience hacks zijn er?
Lees je uberhaupt wat men schrijft?quote:TJHeuvel schreef op woensdag 14 maart 2012 @ 21:40:
En hoe zorg je ervoor dat de stappen die je opstuurt niet aangepast worden door de hacker![]()
[...]
Server state is weldegelijk te kraken, alles is te kraken. Misschien niet voordehandliggend, en wellicht niet eens jouw schuld. Waarom zou je server niet overgenomen kunnen worden door een lek
Het gaat niet om "een beetje beveiliging"; het gaat om het verkeerde type beveiliging gebruiken. Dat is een gedachtefout. Bij client/server moet je je client geen beslissende invloed laten hebben. Het is net als dat men weet dat een dikke ketting om je wiel zonder hem ergens aan vast te maken zinloos is; je kan dan wel discussieren over hoe dik die ketting moet zijn en dat het heel lastig tilt als hij zwaar is, maar alsnog kan je dan beter een touwtje om je frame en een boom binden.
Dan nog blijft de vraag of een mens of een computer het in welke tijd heeft opgelost. Maar gezien de kans dat mensen hier tijd in gaan steken zal het vast werken. Sterker nog, een beetje 'security through obscurity' zal waarschijnlijk ook werken in de praktijk, en misschien werkt 'geen enkele beveiliging' ook welquote:MLM schreef op woensdag 14 maart 2012 @ 19:25:
Een schuifpuzzel is een perfect voorbeeld van iets wat je achteraf kan valideren, er komt geen extra informatie (los van de beginstand) tijdens de game naar voren. Het "pad" naar de oplossing is daarnaast vrij kort op te slaan (3 moves per byte is haalbaar, in ASCII printable)
Wat maakt het uit of een hacker de stappen aan kan passen? Daarmee heeft hij nog geen invloed op de serverside controle of de high-score echt is of niet.quote:TJHeuvel schreef op woensdag 14 maart 2012 @ 21:40:
[...]
En hoe zorg je ervoor dat de stappen die je opstuurt niet aangepast worden door de hacker
Workstation specs Server specs Laptop specs Linux op 5.5G 80GB iPod
Reg. datum: 20-03-2001
Want in geval 2 wordt het vele malen complexer en zou ik niet meer weten hoe het aan te pakken. Dat is namelijk als scriptkiddie 1x de puzzel oplossen met een proxy oid, en daarna met curl de pagina's binnenhalen om de check-digit te achterhalen van die pagina en dan de responses zo snel mogelijk terugsturen. Precies hoe je server simpelweg een supersnelle speler ziet..
Maar persoonlijk zou ik me heel goed afvragen of je dit wel echt openbaar online wilt zetten, ik vermoed dat het een persoonlijk leuk dingetje is, waar misschien nog eens wat vrienden / kennissen op willen spelen, maar waar google en consorten je resultaten enkel maar vervuilen. Persoonlijk zou ik het gewoon uit google houden met een robots.txt en dan achter een captcha / basic-authentication oid gooien zodat de script-kiddies niet direct erop kunnen.
De hele beveiliging van zo'n simpel spelletje gaat tig keer complexer worden dan het hele spelletje zelf.
Verkeerde beveiliging bestaat niet. Nee, het is niet foolproof maar het voegt wel weer een laag toe. Als dit al voor aanzienlijke tijd alle hackers tegenhoud, waarom zou je nu dan tijd en geld investeren in een oplossing welke veel langer duurt om te implementeren. (Nou, misschien als je beveiliging nieuwe lekken veroorzaakt, dan is het misschien verkeerd).quote:Zoijar schreef op woensdag 14 maart 2012 @ 21:48:
Het gaat niet om "een beetje beveiliging"; het gaat om het verkeerde type beveiliging gebruiken.
Laat ik even duidelijk zijn; alles wat je opstuurt moet serverside gevalideert worden. Input van de client is, zonder validatie, niet te vertrouwen. Toch moet je aan een score komen, deze kan je op verschillende manieren berekenen. Een manier is om alle gemaakte stappen op te sturen, iets wat voor een puzzelspel zeker te doen is en theoretisch helemaal de beste oplossing is. Hallelujah! Helaas zitten hier voor sommige andere games nogal een aantal (praktische!) haken en ogen aan; zoalsquote:Dat is een gedachtefout. Bij client/server moet je je client geen beslissende invloed laten hebben. Het is net als dat men weet dat een dikke ketting om je wiel zonder hem ergens aan vast te maken zinloos is; je kan dan wel discussieren over hoe dik die ketting moet zijn en dat het heel lastig tilt als hij zwaar is, maar alsnog kan je dan beter een touwtje om je frame en een boom binden.
- Het duurt lang om te implementeren. Het bijhouden van alle stappen kan erg lastig zijn, laat staan het serverside weer uitrekenen. Helaas zijn veel bedrijven aan gelimiteerde budgetten gebonden, daarnaast willen de meeste game developers games maken, en geen security systems
- Het kan niet praktisch zijn simpelweg door het grote aantal data wat je moet versturen. Stel dat ik een potje civilizations van 5 uur op wil sturen naar de server, het is vrijwel onmogelijk binnen aanzienbare tijd een score terug te krijgen. Laat staan dat het veel server resources kost.
- Je moet alsnog je input valideren. De stappen die opgestuurt worden kunnen natuurlijk ook verandert zijn door een hacker.
Reg. datum: 15-04-2005
Tijd laten opsturen door de client en dan op de server berekenen of die niet teveel afwijkt van het gemiddelde van de onderste 5% van de duur van de potjes. Dan nog kan je dat gemiddelde oprekken, maar dan duurt het vele malen langer. Je moet immers meer potjes indienen. Dan nog een max. 50 per dag ofzo en het gaat al aanzienlijk langer duren om een 'mooie' highscore in te dienen.quote:Gomez12 schreef op woensdag 14 maart 2012 @ 22:52:
Gaat het echt enkel om het aantal zetten (want dan voldoet de server-side check van alle stappen gewoon) of gaat het ook nog om een tijdscomponent die meetelt in de score?
Want in geval 2 wordt het vele malen complexer en zou ik niet meer weten hoe het aan te pakken. [...]
Laat staan dat het dan al niet meer leuk is om te cheaten want je bent namelijk niet 'super leet veel beter' (max zoveel procent sneller dan de anderen).
Dit is alleen veels te veel werk voor zo'n simpel spelletje
Bedenk me net dat je voor de echte overkill ook een machine learning algoritme er op los kan laten die dan later aan de hand van bepaalde input aangeeft of iets legit of cheaten is ^^
Reg. datum: 20-03-2001
Wat is hier volgens jou het probleem mee? Gewoon elke minuut oid (indien mogelijk en asynchroon etc. etc.) een tussentijdse status doorsturen en die doorrekenen.quote:TJHeuvel schreef op woensdag 14 maart 2012 @ 23:00:
[...]
• Het kan niet praktisch zijn simpelweg door het grote aantal data wat je moet versturen. Stel dat ik een potje civilizations van 5 uur op wil sturen naar de server, het is vrijwel onmogelijk binnen aanzienbare tijd een score terug te krijgen. Laat staan dat het veel server resources kost.
De benodigde server-resources zie ik ook ergens in de buurt van de 0 liggen oid. Je hoeft niet te bruteforcen, je moet enkel sequentieel de stappen doorrekenen, dus als de speler 20 poppetjes uit een stad haalt, hoef je enkel maar te kijken of die ene stad >20 poppetjes heeft. Hoeveel poppetjes er in elke andere stad in het speelveld aanwezig zijn is niet relevant.
Dus oftewel, in het begin is iedereen een bot want er is geen onderste 5%, na het 1e spel is het maar hopen dat dat een goede speler was, anders wordt >99% van je andere menselijke spelers tot bot verklaard etc. etc.quote:Caelorum schreef op woensdag 14 maart 2012 @ 23:12:
[...]
Tijd laten opsturen door de client en dan op de server berekenen of die niet teveel afwijkt van het gemiddelde van de onderste 5% van de duur van de potjes.
En dan heb je eindelijk een wereldprimeur, de wereldkampioen puzzelen wil live op de tv jouw spelletje gaan proberen. Oeps, hij is beter dan de onderste 5%
Jij hebt een mooie bot-protectie gemaakt, enkel faalt die in het stukje false negatives
Reg. datum: 15-04-2005
Dat is gewoon een kwestie van goede begindata in je database stoppen. Overigens vanuit marketing oogpunt ook een goede. Je wilt niet een lege highscore list hebben... Als ontwikkelaar kan je wel een goede inschatting maken van hoe snel een potje af kan zijn. (alleen al de tijd voor de animaties bij elkaar optellen bijv.)quote:Gomez12 schreef op woensdag 14 maart 2012 @ 23:32:
[...]
Dus oftewel, in het begin is iedereen een bot want er is geen onderste 5%, na het 1e spel is het maar hopen dat dat een goede speler was, anders wordt >99% van je andere menselijke spelers tot bot verklaard etc. etc.
En dan heb je eindelijk een wereldprimeur, de wereldkampioen puzzelen wil live op de tv jouw spelletje gaan proberen. Oeps, hij is beter dan de onderste 5%
Jij hebt een mooie bot-protectie gemaakt, enkel faalt die in het stukje false negatives
Daarnaast heeft natuurlijk vrijwel elke vorm van detectie op real life data false positives en false negatives. Kijk maar naar creditcard fraude detectie systemen en virusscanners. Je hebt mij ook niet zien zeggen dat het algoritme perfect was oid.
@zoijar (beneden): Zoiets dacht ik al, ben zelf nog maar sinds kort bezig met machine learning (paar weken les), dus zit nog in de "zie overal ML"-fase
Caelorum wijzigde deze reactie 15-03-2012 00:11 (9%)
offtopic, maar dit wordt idd gedaan voor de grotere spellen om bots te detecten. Support vector machine op een aantal input dimensies oid.quote:Caelorum schreef op woensdag 14 maart 2012 @ 23:12:
Bedenk me net dat je voor de echte overkill ook een machine learning algoritme er op los kan laten die dan later aan de hand van bepaalde input aangeeft of iets legit of cheaten is ^^
Ik probeer sinds een jaar ongeveer er wat meer over te leren, maar dat gaat moeizaam met schaarse webresources. Ik ben er wel achter dat de daadwerkelijke statistiek vrij ingewikkeld is (maar ik heb een aantal jaar statistiek gestudeerd, dus kan het net volgen...) Hoe beginnen ze met zo'n vak? Wat voor stof leer je dan? Beginnen ze gewoon met multivariate statistics?quote:Caelorum schreef op woensdag 14 maart 2012 @ 23:43:
@zoijar (beneden): Zoiets dacht ik al, ben zelf nog maar sinds kort bezig met machine learning (paar weken les), dus zit nog in de "zie overal ML"-fase
Ik lees soms eens wat in het boek "The elements of statistical learning" wat volgens mij vrij veel bevat, maar erg moeilijk doorheen te komen. Duurde al even voor ik de "curse of dimensionality" echt begreep...
Pagina: 1

