Hur gör man om man vill att ens script enbart ska kunna anropas utan en flashfilm.
Gör en hiscorelista till ett flashspel och vill inte att man ska kunna skicka vilken poäng man själv tycker man är värd ;)
20 svar · 676 visningar · startad av M@rtin
Hur gör man om man vill att ens script enbart ska kunna anropas utan en flashfilm.
Gör en hiscorelista till ett flashspel och vill inte att man ska kunna skicka vilken poäng man själv tycker man är värd ;)
Den enklaste lösningen vorde väl att kolla referrer i scriptet så att förfrågan kommer från samma host.
Ja det är sant, provar det :) Tack!
btw, hur gör man det? ;)
Request.ServerVariables("HTTP_REFERER") verkar vara tom när scriptet anropas från en flash fil. Kan hända att det bara blir så i IE (läste något om det någonstanns) men det är ju tillräckligt illa. Finns det någon annan variabel man kan kolla?
Kolla om HTTP_USER_AGENT innehåller något skojsigt
Jag vet inte, ska kolla, men jag kom på en annan idé. Jag använder POST metoden så om HTTP_REFERER är tom kan väl ingen skicka falska request.form variabler? Alltså borde det räcka att kolla att HTTP_REFERER är tom? Eller skulle någon kunna göra en flashfilm på en annan server och på så vis få HTTP_REFERER att vara tom samtidigt som den skickar variabler? Det borde ju gå faktiskt, attans.
M@rtin skrev:
Eller skulle någon kunna göra en flashfilm på en annan server och på så vis få HTTP_REFERER att vara tom samtidigt som den skickar variabler? Det borde ju gå faktiskt, attans.
Problemet är nog inte andra flash-filmer, och HTTP_REFERER är aldrig något att lita på. Vill man jävlas med någons hiscorelista så lär man försöka nyttja sådana trick.
M@rtin skrev:
HTTP_USER_AGENT get följade: Mozilla/4.0 (compatible; MSI
vilket kanske inte hjälper så mkt?
Nej, tyvärr, inte ett dugg.
Intressant fråga detta... Det blir nog svårt att lösa vattentätt, men man kan ju försöka att göra det slitsamt för hackarna. Har man ett spel som tar en stund att köra så kan man ju kanske låta flashen kommunicera med servern under spelets gång, och därigenom samla på sig variabler som blir en sessions-unik krypteringsnyckel. Eller så hittar man på något annat som gifter ihop spelomgången med överskickandet av hiscore.
Flash-filmer är ju väldigt lätta att dekompilera, så man kan inte räkna med att skydda sig helt genom att bygga in "kryptering", men det är en bra bit på väg.
Vill man jävlas med någon som försöka posta hiscore med en vanlig webbläsare så kan man ju tänka sig att använda Javascript på ASP-sidan som tar emot. Scriptet kommer ju inte att beröra flashen, men webbläsaren kommer inte undan (om man inte stängt av javascript).
Om man lyckas identifiera ett hackningsförsök så kan man slutligen kanske försöka lura hackaren att han/hon lyckats, m.a.o visa dennes enorma hiscore, men endast för honom/henne.
Jag är inte så haj på ASP, men med PHP har det funkat bra med referrer från flash.
Men det är väl inte helt vattentätt som emission säger.
En idé kanske kunde vara att skapa en nyckel som man sparar på servern associerat med ett unikt id för varje spelare.
Sedan skickar man en krypterad version samt id till spelaren.
Om spelaren får ett highscore decrypteras nyckeln på servern och jämförs med den nyckel som sparats med motsvarande id.
Jag är ingen säkerhetsexpert direkt, men om krypteringen är stark förmodar jag att det blir rätt knepigt att hacka.
Blixtsystems skrev:
Jag är inte så haj på ASP, men med PHP har det funkat bra med referrer från flash.
Men det är väl inte helt vattentätt som emission säger.
Referer (sic!) är samma sak i ASP som i PHP.
Blixtsystems skrev:
Jag är ingen säkerhetsexpert direkt, men om krypteringen är stark förmodar jag att det blir rätt knepigt att hacka.
Precis, det blir knepigt, och det räcker antagligen långt.
emission skrev:
Referer (sic!) är samma sak i ASP som i PHP.
Jag menade att jag brukar få en referer från mina swf filer med PHP då jag provat, vilket tydligen var inte var fallet nu för M@rtin med ASP och IE.
Det var dock ett tag sen jag provade så det kan vara så att senare versioner av flash eller IE har samma problem med både ASP och PHP.
Men...du har rätt i att det hursomhelst är en mycket vansklig metod.
Vad jag gärna skulle vilja veta är om det finns några dierkta luckor i en sådan lösning som jag föreslog.
Visst, ingen kryptering är helt oknäckbar, men med bra kryptering blir det mer än knepigt skulle jag tippa på.
Vad M@rtin är ute efter är förmodligen inte en lösning som han är säker på att en superhacker med en superdator till förfogande omöjligen kan knäcka.
Allting går att knäcka, men det betyder kanske inte att ingen lösning är en "säker" lösning.
Blixtsystems skrev:
Vad jag gärna skulle vilja veta är om det finns några dierkta luckor i en sådan lösning som jag föreslog.
Visst, ingen kryptering är helt oknäckbar, men med bra kryptering blir det mer än knepigt skulle jag tippa på.
Problemet ligger i att Flash-filer är lätta att dekompilera, så i praktiken blir lösningen osäker eftersom hela krypteringsförfarandet ligger öppet. Risken ligger inte i krypteringens kvalitet, utan i att hela förfarandet kommer att gå att kopiera.
Om man krypterar i Flash ja.
Det är därför jag föreslog att hålla krypteringen på servern.
Blixtsystems skrev:
Om man krypterar i Flash ja.
Det är därför jag föreslog att hålla krypteringen på servern.
Men "klienten" kan ju inte vara ovetande om hur den ska kommunicera med servern. Utgångspunkten är att klienten rapporterar in sin hiscore.
Jag förstår inte riktigt vad du menar.
Vad jag föreslog var att servern krypterar en nyckel och skickar den till Flash med ett unikt id.
Vid highscore skickar Flash tillbaka den krypterade nyckeln och id.
Servern dekrypterar sedan nyckeln och jämför med den icke krypterade nyckel som den sparat med id nummret.
Alltså är det enda som behöver skickas fram och tillbaka till flash krypterad information samt ett id nummer.
Om användaren sniffar reda på den infon måste han fortfarande knäcka krypteringen för att kunna använda den till att skicka ett highscore, alternativt ta sig in i databasen för att leta reda på okrypterade nycklar.
Om man är orolig för att det skulle hända kan man tidsbegränsa gitligheten för en nyckel för att göra det ännu svårare.
Nej, nu är jag inte med. Med det flöde som du beskriver fyller inte krypteringen någon som helst funktion. Kryptering och dekryptering måste ske vid varsin ändpunkt, annars är den verkningslös, och med utgångspunkt i detta måste vi ha någon kryptering eller dekryptering i "klienten" (flash-filen). Eftersom denna med enkelhet kan knäckas så kvarstår problemet att det endast är knepigt eller arbetssamt att hacka kommunikationen.
Hmm...du har förstås rätt.
Om man sniffar reda på den krypterade nyckeln så är det förstås bara att skicka den tillbaka om dekryptering sker på servern. :)
Jaja...det verkar inte vara lätt att lyckas göra ett skapligt säkert highscore system.
Lite googlande tyder på att de flesta tror att det helt enkelt inte går.
Man får använda en komination av tekniker för att se till att det blir så svårt som möjligt om man tex har prispengar på spel.
Tex, en java-popup för att se till att en referer skickas, kolla mot ett session id samt en cookie.
Det säkraste är förmodligen att använda FLASM för att kunna lägga in krypteringrutinen som obfus bytecode vilket gör det svårt att dekompilera, men det är inte den enklaste lösningen direkt.
Blixtsystems skrev:
Det säkraste är förmodligen att använda FLASM för att kunna lägga in krypteringrutinen som obfus bytecode vilket gör det svårt att dekompilera
Ja, det borde vara det bästa.
Oj va ni har diskuterat. Och jag är förvånad över att det inte går, måste ju vara en jättebrist i de flesta flashspel då.
För mitt spel räcker det nog att jag skickar ett lösenord från flash som kollas på servern. Det finns inga prispengar eller liknande på spel och jag tror ingen tar sig tid att dekompliera även om det är enkelt.
Men jag ska fortsätta klura på ett säkert sätt :)
Tack för era svar!
Jag funderade lite på det här problemet igår innan jag skulle sova och nyss vaknade jag med en ny idé.
När man köra loadVariablesNum i flash så anger man ju en lokal sökväg. Borde man då inte kunna lägga ett lösenord i en textfil utanför den publika rooten på servern. Sedan laddar man in lösenordet i flash med relativa sökvägar typ "../../hemligt/pass.txt"? Då kan man ju i asp filen sedan kolla att de stämmer överens när den anropas.
Jag tycker det borde fungera, men som sagt så vaknade jag precis och logiken brukar inte alltid fungera när man drömmer.
Kan bristen i mitt resonemang vara att det egentligen inte är en lokal sökväg i flash utan att flash automatiskt bara lägger på domännamnet före?
Kritisera!