JavaScript vs biztonság
2012-12-03T21:52:23+01:00
2012-12-06T10:06:57+01:00
2022-07-23T18:16:15+02:00
  • Érdekesség, webgl nélkül:
    Edit fiddle - JSFiddle


    Desktop chrome alatt egészen jól megy, viszont samsung galaxy tab 2 7 Opera 12 - megy, de eléggé döcögve, ugyanitt chrome: mint egy csiga.

    Az a baj, hogy a mobil eszközök grafikus kártyáit jelenleg még nem használják ki a böngészők. ( Van benne 3D gyorsító kártya ).
    Ezen a téren még van mit fejlődni. Lehet, hogy érdemesebb mobilra app-ot írni (back to flash / native ).
    Mutasd a teljes hozzászólást!
  • A tömbös megoldással az a baj, hogy nagyon lassú lesz, szerintem. (Hisz még egy plusz lookup is kell majd minden változó elérésnél)

    Érdekesség, webgl nélkül:
    Edit fiddle - JSFiddle
    Mutasd a teljes hozzászólást!
  • Ezzel a megoldással is csak az a baj, hogy elég oda rakni a megszakítást, ahol már értelmezted a programot, és utána megnézni a kódot.

    Nézd át a chrome nyomkövetési lehetőségeit. Praktikus a consol network részét megnézni futás közben. Ez nem csak hátrány, hanem fejlesztési szempontból roppant hasznos.

    Amúgy simán real time játékot is írhatsz js-ben, sőt webGL alatt elég gyors 3D programot is. Igaz, hogy akkor nem csak böngésző, de eszközfüggő problémáid is lesznek. A performance a video kártya sebességétől függ. Mobil eszközökön pedig még nem megy.
    Mutasd a teljes hozzászólást!
  • Köszi a tippet!
    Ezt a konzolos dolgot Firefox alatt próbáltam, de (legalábbis nekem) nem működött, lehet a Crome lazábban veszi ezt.
    Mondjuk egyszerű védelmet már kitaláltam rá, de több szakértelemmel, forráskód vizsgálatával kijátszható.

    Mondjuk megoldást adhatnának a böngésző gyártók is.

    1-lefordított byte kódot töltenénk le forráskód helyett (nem mindegy a böngészőnek, hogy egy szót, vagy egy számot nem ért?).

    2-a JS kulcsszavakat, nyelvi elemeket kicserélhetném saját elemekre, ezek szerepelnének a forráskódban. A böngésző meg tudná, hogy X fájlban található a "szótár" ami alapján futás/fordítás alkalmával értelmezni kell azt. Így a böngésző JS kódot látna, a felhasználó meg az érthetetlen katyvaszt. (Feltörhető, de nehezebb.)

    Most az jutott eszembe, hogy a változókat tárolhatnám egy nagy tömbben, a változó neve helyett csak a sorszámával tudnám ugye azonosítani, a sorszámot meg sosem direkt adnám meg, hanem változóban tárolnám. Így egy-egy változó megtalálása sokkal nehezebb lenne.
    Esetleg az eljárások hívása is változók értékétől függően ágazna el, így nehezítve a nyomkövetést.

    Meg a fejlesztést is
    Mutasd a teljes hozzászólást!
  • Ha én írnék ilyet (teszt verzió készülget), akkor kliens oldalra raknék többfajta minijátékot, ami lekötné a játékost, így tehermentesítené a szervert (ritkábban kell hozzászólni), változatosabb, érdekesebb lenne talán, és nem az üres képernyőt kellene bámulnom kis szöveggel, hanem játszanék, és közben gyűjteném a tapasztalati pontokat.

    Különböző missziók kellenek, amiket mondjuk 5 percenként lehet megcsinálni

    Fontos, hogy ahogy fejlődik a játékos, egyre több erőforrást lehessen kapni a rövid missziókért.

    Így elérheted, hogy folyamatosan rajta lógjon (vagy persze írjon rá szkriptet ).
    Mutasd a teljes hozzászólást!
  • Chromeban:
    Egyszerűen breakpontokat helyezel el a kódban, ekkor megáll ott a JS futása, aztán átírod az értékét az ott elérhető változóknak.

    Ha globális változó, akkor egyszerűen a konzolba: life = 1000;
    Mutasd a teljes hozzászólást!
  • MMO-nál könnyeb dolga van a fejlesztőnek..


    Nem feltétlenül.
    A jelenlegi MMO-kat pont azért nem szeretem, mert "nincs benne játék", kattintok 3 ikonon és várom, hogy fejlődjön a karakter/birodalom, ezalatt nem tudok semmit csinálni.
    Ha én írnék ilyet (teszt verzió készülget), akkor kliens oldalra raknék többfajta minijátékot, ami lekötné a játékost, így tehermentesítené a szervert (ritkábban kell hozzászólni), változatosabb, érdekesebb lenne talán, és nem az üres képernyőt kellene bámulnom kis szöveggel, hanem játszanék, és közben gyűjteném a tapasztalati pontokat.
    Ennek meg úgy van értelme, ha a játékos ügyességén múlik az eredmény és nem azon, hogy mit sorsolt a szerver.

    Itt meg pont az a gond, hogy erre így akkor a JS nem alkalmas.

    De más hasonló játék készítésére sem. (De még bízom benne, hogy valami megoldást találunk)

    stl: Nálam fent van a firebug kiegészítő, de hiába nyomogatom az F12-t, nem tudom egy JS változó értékét sem módosítani, csak ha rámutatok a forráskódban akkor kiírja az értékét. Hogy lehet módosítani?
    Mutasd a teljes hozzászólást!
  • Amúgy a flash-t is elég jól vissza lehet fejteni. Például a Sothink Decompilerrel sokkal jobban meg lehet találni a képeket egy adott swf-ben, mint magában a flash fejlesztő környezetben.

    Hahahaha

    Mondjuk utoljára a Flash MX-et láttam, de arra nagyon igaz volt ez
    Mutasd a teljes hozzászólást!

  • a Sothink Decompilerrel sokkal jobban meg lehet találni a képeket egy adott swf-ben, mint magában a flash fejlesztő környezetben



    Kellemes fejlesztőkörnyezet lehet
    Mutasd a teljes hozzászólást!
  • Még azzal lehet trükközni, hogy dinamikus js-t használsz, aminek nem minden része van egyszerre bent. Vannak részek amiket kitöröl a program, másokat menet közben hív be.

    Illetve a változó nevekkel is lehet játszani, ha írsz egy szerver oldali változónév táblát, ahol minden futáskor minden változó és függvény random nevet kap, persze a kód törpítve van és a változónevek mondjuk:
    var ຊັດ=12 //sajnos itt a fórumba nem működnek az utf8 karakterek
    nem is ascii karaktereket ad a szerver, csak a jól olvashatóság kedvéért.

    Persze mindez csak egyszerű nehezítés.

    Amúgy a flash-t is elég jól vissza lehet fejteni. Például a Sothink Decompilerrel sokkal jobban meg lehet találni a képeket egy adott swf-ben, mint magában a flash fejlesztő környezetben.
    Mutasd a teljes hozzászólást!
  • Ebbol a szempontbol mindegy hogy js vagy flash

    Csak amíg a flash-t nem olyan egyszerű visszafejteni és így el lehet kódolni vele a postolandó adatokat, addig js-t lehetetlen, mert akkor nem érti meg a böngésző. Persze a kliensen végzett rejtjelezés nem túl biztonságos, de jobb mint a semmi ami js-el rendelkezésedre áll.
    Mutasd a teljes hozzászólást!
  • Egy weboldal/jatek alapvetoen ugy mulodik hogy a kliens elindit egy kerest (swf / js fileok stb) ezek amikor visszajonnek azokat termeszetesen sajat maga futtatja a sajat memoriajaban, tehat persze bele lehet nyulni a futo kodba, mivel a kliensen fut.

    De ami fontosabb hogy a felhasznalonak eleg monitorozni a szerver kereseket, megnezni hogyan neznek ki es onnantol tud ugyanolyat kuldeni. Ebbol a szempontbol mindegy hogy js vagy flash vagy miben fut a jatek, el se kell inditania eleg egy http kerest inditania ugyanugy mintha a jatekbol lett volna kuldve.

    Trukkozni a keresben megirt infokkal lehet, pl ahogy masok irtak hogy nem az eredmenyt kuldod el, hanem a jatekos interakcioit, de itt pl kritikusnak erzem hogy garantalni kell hogy ugyanugy fusson le a szerveren is a jatek mint a gepen, ami nem is olyan trivialis - kulonben egy legalis jateknak mas lesz a pontszama szerveren mint amit a user latott..
    Mutasd a teljes hozzászólást!
  • Tudom, pont azért mondtam, hogy ez nem egy olyan vizsgálat, aminek az eredményétől függően megszakad a program, csak egy olyan rész ami figyeli, hogy ki az aki próbálkozik. Lehet fűszerezni ezt az elképzelést néhány kritikus változó behesselésével is. De mint írtam kritikus változó nincs a kliens oldalon. Hiszen mondjuk átírja a saját tapasztalati pontjainak a számát, és látványosan több is van a képernyőjén, mint a valóságban, ettől még nem fog szintet lépni, mert ahhoz az kell, hogy a szerveren változzon az exp. Amire viszont nincs befolyása. A kliens oldalon ezek az értékek csak megjelennek.
    Mutasd a teljes hozzászólást!
  • A kód vizsgálata nem elég, hisz elég egy változó értékét átírni a böngészőben (F12) - vagy postolni kamu eredményt.
    Mutasd a teljes hozzászólást!
  • MMO-nál könnyeb dolga van a fejlesztőnek, mert a játék lényegi része a szerveren fut, és a program úgyis csak az interakciós lépéseket küldi a szerver felé, amit az szépen ellenőriz. A véletlen dobások/harc úgyis a szerveren fut, a kliens csak az eredményt, vagy a folyamatot kapja meg.
    Persze ez egyet jelent azzal, hogy a játékos bármikor írhat botot, ha visszafejti a kommunikációt, mivel egy futó js-t simán lehet menet közben módosítani. A kommunikáció, pedig átlátható, ott bináris/codolt csomagok küldésével lehet megkeseríteni a hackerek életét.

    Esetleg a progam kritikus részein időről időre önmagán egy hasCode vizsgálatot lefuttathat ( bár azt is gyorsan meg lehet kerülni ) - nem egyből gyilkolná le a futást, de szerver oldalon loggolná, ha valaki a kód módosításával próbálkozna.

    hash from string


    Mutasd a teljes hozzászólást!
  • Azt hittem lesznek erre tuti és egyszerű megoldások, csak én vagyok tudatlan.

    Árnyék: Hasonló a téma. Egy adatot nagyjából biztonságosan el tudnék küldeni a szervernek (félúton ha elkapják akkor nem nagyon tudják módosítani). A gond, hogy a forrás oldalon hamisítják esetleg az adatot, és eleve hamis adat indul el a klienstől. (Illetve a titkosító algoritmust is megnézhetik.)

    Jó lenne tudni, hogy a futó programba bele lehet e nyúlni, mert ha nem, akkor lehet elég lenne ellenőrizni a domaint, ahonnan a kérés érkezett, így egy saját gépen futtatott JS-t gondolom ki tudnék zárni.
    Esetleg toplistába írás előtt kérni a szervertől egy kódot, ami az eredetiséget igazolná /biztosítaná.

    nadamhu:
    A js kód minify-olásáról tudok. E mellett gondolom minden felismerhető változó és eljárás nevet érdemes cserélni kevésbé beszédesre. Meg ha akarja az ember megkavarhatja a forrást, hogy a kezdő JS-es elveszítse a fonalat.
    Gond az, ha egyben átemeli a kuszált kódot, ha megtalálja hol kell egy számot átírni akkor már nyert ügye van.
    Mutasd a teljes hozzászólást!
  • Ha elég sok munkát belefektetsz, akkor csinálhatsz egy olyat, ami a hackertől is relatíve sok munkát igényel:

    - A szerver legenerál egy random seed-et minden játék elején, és kiküldi a kliensre.
    - A kliens a játék közben a seed alapján pszeudo random módon találja ki, hogy milyen tetris elemek jönnek. Seedelhető pszeudorandom generátor Javascripthez:

    davidbau.com Random Seeds, Coded Hints, and Quintillions

    A játék végén a kliens a teljes játéktörténetet postolja a highscore-al együtt. (Tehát minden lépést, amit a tetris kockákkal teszel).

    A szerver a seed alpján a pszeudovéletlenszámokat reprodukálva ellenőrzi, hogy az elem leosztás megfelel-e a seednek, és ellenőrzi, hogy a felküldött játékmenet valid játékmenet-e és megfelel-e az adott elemleosztásnak.

    Persze még ezt is meg lehet hackelni, csak ezt már nehezebb. Pl. meghekkelhető, ha a hacker ír egy tetris-t játszó botot. Vagy ha átíja a klienst úgy, hogy vissza lehet lépegetni ha baj van; ilyenkor mondjuk végig kell játszania a játékot, csak könnyebb a dolga az undo lehetőségek miatt...

    Persze a kliens kód js minify-olása a minimum.
    Mutasd a teljes hozzászólást!
  • Lásd saját hozzászólásodat ebben a témában. Az általad feltett kérdés nem különbözik semmiben sem az ottanitól!
    Mutasd a teljes hozzászólást!
  • Simán belenyúlhat, de ez a flashnél és javanal is megvan, csak talán nehezebb.

    Legjobb mondjuk szerintem eventeket küldeni a szervernek.

    Tetris esetében pl, hova került az adott elem és lejátsszani ugyanazt a játékot, bár ez nem a legerőforráskímélőpbb megoldás.




    Sztem amúgy nagyobb baj, pl MMO játékoknál, hogy hogyan tudod megállapítani, hogy nem csalt? (Sokkal több lehetőség mint a tetrisben)

    Pl hogy Aból Bbe hogy jutott el.
    Mutasd a teljes hozzászólást!
  • Hali!
    Eddig nem gondolkodtam rajta, de most problémát okozott nekem, így gondoltam "beszéljük meg".

    Szóval a kérdésem annyi, hogy ha készít ez ember egy egyszerű játékot JavaScript-ben, legyen ez mondjuk egy egyszerű TETRIS, amiben a játékos szerezhet pontokat, majd ezt a pontszámot elmentené az ember szerveren. Hogy kellene ezt megoldani, hogy az biztonságos legyen, ne lehessen csalni azzal, hogy tetszőleges pontszámot elküld a felhasználó?

    Olyan játékoknál, ahol állandó online kapcsolat van, ez talán megoldható azzal, hogy a kliens csak az inputot adja, a játék magán a szerveren fut.

    Esetleg úgy, hogy a szerver 1-2 másodpercenként küld egy random kódot a kliensnek és csak akkor hallgat a kliensre, ha az az aktuális (1-2 másodpercig érvényes) kódot küldi vissza.

    A JS forráskódhoz ugye a felhasználó könnyen hozzáfér. Kérdés, hogy az éppen futó JS kódba is bele tud írni, változók értékét módosítani? Vagy csak annyit tud, hogy megvan neki a forráskód és külön futtatja azt (módosítás után) saját lapon?

    Van egyáltalán erre megoldás? Vagy nem érdemes ilyesmit JS-ben (HTML5) fejleszteni?
    Oké, hogy a Java vagy FLASH kód is visszafejthető, de azért sokkal több szakértelmet igényel, emiatt mégiscsak biztonságosabb.
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd