1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Koordinaten verschlüsselt übertragen

Dieses Thema im Forum "Javascript & Ajax" wurde erstellt von ThiKool, 29. Dezember 2016.

  1. ThiKool

    ThiKool Erfahrenes Mitglied

    Hallo Zusammen,

    ich habe folgendes Problem.

    Ich habe eine Jquery Animation laufen, die per Button gestoppt wird.
    Dann werden die aktuellen Koordinaten des (gestoppten) animierten Objekts per Ajax an den Server übermittelt.

    Gibt es irgendeine Möglichkeit mich vor Manipulation zu schützen? Denn wenn Jemand die gewünschten Koordinaten zB. left 100, top 100 kennt, kann er ja so selbst Ajax Requests absetzen ohne den Button zu drücken (der nicht immer verfügbar ist usw).

    Ich habe es mit CryptoJS probiert - dies ist aber auch witzlos, da ich den Key ja im JS zusammenbauen muss -> also auch wieder nachvollziehbar wie das funktioniert.

    Der einzige Ansatz der mir einfällt wäre hiermit (http://html2canvas.hertzen.com/) einen Screenshot zu erstellen und diesen dann Serverseitig nach dem gewünschten Objekt abzusuchen.

    Ich danke euch
     
    Zuletzt bearbeitet: 29. Dezember 2016
  2. sheel

    sheel I love Asm Administrator

    Hi

    also die möglichen "Bösen" sind nicht nur Dritte, sondern auch der eigentliche Verwender der Webseite?
    Clientseitig kann man dann gleich vergessen.

    Der Server muss selber mitrechnen, wie der Stand am Client gerade ist und ob ein erhaltener Buttondruck dadurch gültig ist. (Weiß ja die Details nicht, aber je nach Situation ist es dadurch evt. gar nicht möglich bzw. erfordert etwas prinzipiell anderes.)
     
  3. ThiKool

    ThiKool Erfahrenes Mitglied

    Hmm, danke, sowas dachte ich mir schon.

    Was hälst du von der Variante mit dem Screenshot? Nicht sehr performant oder?

    Weißt du ob man aus einem base64 String gleich die Koordinaten eines darin befindlichen Unterstrings erkennen / herauslesen kann, oder muss ich daraus erst ein .jpg generieren und dann per PHP drüber?
     
  4. SpiceLab

    SpiceLab ZENmechanic Premium-User

    Vielleicht ein verstecktes Formularfeld <input type="hidden" value=""> einbinden, dessen leeres value-Attribut beim Versand mit Daten gefüllt wird, die die Aktion verifizieren.
     
  5. ThiKool

    ThiKool Erfahrenes Mitglied

    @SpiceLab:

    Das Problem ist, dass erstmal nichts per Formular versandt wird, sondern per Ajax übertragen werden muss.
     
  6. sheel

    sheel I love Asm Administrator

    Der Screenshot ist doch auch nur clientseitig => fälschbar.

    Sachen in einem Bild finden, dass man als Base64 hat, ist theoretisch zwar möglich, aber praktisch müsste man sehr viel Bildhandlingcode selber schreiben. Mit einem Funktionsaufruf Base64 zuerst zurückumwandeln ist jedenfalls viel einfacher.

    edit: Auch ein Hidden-Feld ist nicht sicher. Clientseitig ist gar nichts sicher. ...Ich weiß ja nicht, wie sicher es sein muss bzw. wie viel Aufwand einem Angreifer zuzumuten ist. Daher die Annahme "beliebig viel".
     
  7. ThiKool

    ThiKool Erfahrenes Mitglied

    Danke,
    hmm habe jetzt ein bisschen mit der Screenshotvariante experimentiert.
    Problem: den Base64 String muss ich ja ebenfalls per Ajax übertragen und dieser bleibt ja auch immer gleich.
     
  8. ThiKool

    ThiKool Erfahrenes Mitglied

    Also wie ich das sehe, gibt es keine Möglichkeit zu validieren, ob wirklich ein echter User auf den Button geklickt hat und somit die Koordinaten korrekt sind, oder ob die Übertragung einfach aus der Dev Konsole stammt.

    Bleibt nur noch die Variante mit dem Serverseitigen mitrechnen und die ist sicherlich zu ungenau.
     
  9. ThiKool

    ThiKool Erfahrenes Mitglied

  10. sheel

    sheel I love Asm Administrator

    Außer dass es
    a) Requests an den Server nicht einmal irgendwie betrifft
    b) auch händisch schnell zerlegbar ist, und automatisiert sowieso
    ?

    Ich wiederhols gern nochmal: Wenn man außerhalb vom eigenen Server keinem vertrauen kann, auch nicht dem Client, dann kann man außerhalb vom Server eben keinem vertrauen.
    Es gibt absolut keine verlässliche Möglichkeit herauszufinden, wie HTTP-Requests erzeugt wurden (von deinem JS-Programm oder nicht), wenn dieses Programm auf einem fremden Computer läuft.
     
  11. ThiKool

    ThiKool Erfahrenes Mitglied

    Ok danke, dann kann ich das Konzept wohl vergessen.
     
  12. ThiKool

    ThiKool Erfahrenes Mitglied

    Ich verzweifel noch...
    Ich habe versucht, keine Koordinaten zu übergeben und stattdessen vom Server mitrechnen zu lassen. Das Problem ist nur, dass der Ajax Request ja immer unterschiedlich lange dauert. Bekommt man die Request Zeit irgendwie raus also Serverseitig? (oder auch nur wieder Clientseitig)
     
  13. sheel

    sheel I love Asm Administrator

    Nein.
    Und auch wenn, es besteht keine Garantie dass die Ajax.Geschwindigkeit mit der Anzeigegeschwindigkeit am Client zusammenpasst.

    Vielleicht wäre es einmal hilfreich zu wissen, worum es überhaupt geht. Ist das zB. ein Spiel? Gegen Andere und dabei "cheaten" verhindern, oder allein und es geht um öffentliche Highscores, oder...?
     
  14. ThiKool

    ThiKool Erfahrenes Mitglied

    Ja genau, es geht um ein Spiel gegen andere und darum zu verhindern - das man nicht ständig Treffer landet indem man die optimalen Koordinaten per Konsole übermittelt
     
  15. ComFreek

    ComFreek Mod | @comfreek Moderator

    Genau, das ist die Lösung!
    Wo genau hast du dadurch Zeitprobleme?
    Den Client kann du durchaus weiterrechnen lassen, bevor der Server ihn kickt. Die Anfragezeit kannst du wohl mit ein paar Testmessungen immer mal wieder im Durchschnitt berechnen.
     
  16. sheel

    sheel I love Asm Administrator

    Falls die Zeitprobleme der Serverlösung nicht lösbar sind bzw. zu ungenau sind, sind die Chancen wohl gleich 0. Eine wirklich gute Lösung gibt es einfach nicht, und alle irgendwie nützlichen sind in JS nicht möglich.

    edit Comfreek: Dass das (bei Lösung der Zeitprobleme) die Lösung ist, war schon in Beitrag 2 :p :D
     
  17. ComFreek

    ComFreek Mod | @comfreek Moderator

    Aaah, ich sollte die Beiträge genauer lesen das nächste Mal :)
     
  18. ThiKool

    ThiKool Erfahrenes Mitglied

    Ich habe jetzt das Mitrechnen probiert - leider ohne Erfolg.

    ich übergebe dem Ajax den Date.getTimestamp() bei dem die Animation startet und im Ajax PHP File hole ich mir die microtime(true).

    Die Differenz multipliziere ich dann mit den Pixeln.
    Lokal habe ich nur eine Abweichung zwischen 3 und 10 Pixeln - auf dem Server allerdings bis zu 100.

    Mach ich etwas falsch, oder funktioniert es einfach nicht?
     
  19. sheel

    sheel I love Asm Administrator

    Date.getTimestamp() liefert afaik Sekunden, nichts genaueres.

    Wenn "lokal" "mit lokalem Webserver" bedeutet (der andere Server eben entfernt ist) und das akzeptabel funktioniert, könnte das noch was werden. Jetzt gehts, wie Comfreek auch schon sagt, noch um das Herausfiltern der Übertragungszeit.
    Der Client muss, am Besten bevor das Spiel startet oder so, ein paar Ajax-Anfragen mit (Milli/MIkro)Timestamp machen, wobei der selbe Timestamp vom Server wieder unverändert zurückgesendet wird. Am Client dann (Jetzt-Empfangen)/2, und auch noch den Durchschnitt aller Anfragen, sollte eine ungefähre Übertragunszeit in eine Richtung geben. Wenn man bei jeder Anfrage außer der Ersten die aktuelle Schätzung mitschickt kann der Server nebenbei auch ermitteln, wie versetzt die Uhren von Server und Client sind (und das auch jedesmal als zweiten Antwortteil dazupacken, dann weiß es der Client auch).

    Mit Wissen von Pingzeit und Uhrenversetzung sollte es dann möglich sein, die Berechnungen ähnlicher zu machen.
    Trotzdem aber nicht vergessen, dass die Anfragen am Kabel noch immer reale Zeit benötigen, egal ob rausrechenbar oder nicht, und auch dass die Pingzeit stark variieren kann.
     
  20. ThiKool

    ThiKool Erfahrenes Mitglied

    Vielen vielen Dank euch nochmals, es sieht nun sehr gut aus.

    Gibt es noch eine Möglichkeit Last auf dem Server zu simulieren?
    Reicht es im von Ajax aufgerufenen PHP File an erster Stelle ein sleep zu setzen?
     
Die Seite wird geladen...