noel-friedrich / terminal

Terminal-style Personal Homepage
https://noel-friedrich.de/terminal
MIT License
44 stars 7 forks source link

API is not secured #21

Closed linuxchr closed 4 months ago

linuxchr commented 5 months ago

You can access the API from web and so you can send command to upload a very high highscore with your name: https://www.noel-friedrich.de/terminal//api/upload_highscore.php?game=tetris&name=Christian&score=42424242&

noel-friedrich commented 5 months ago

Yep! You're correct! From now on, highscores will be have to confirmed. I didn't implement this before, as I didn't think anyone was actually going to abuse this (I like being naive sometimes!).

I know that this isn't a great solution, but I don't think any more security is needed with the amount of users right now. If you have any thoughts, please let me know! Thank you!

linuxchr commented 5 months ago

Deutsch:

Wie wäre es mit einer Lösung bei der die API nur vom Server aus abrufbar ist? Dies wäre nicht Perfekt, aber es schwieriger machen.

Christian

linuxchr commented 5 months ago

Am zum Upload des Scores sendet Server einen Symetrischen Schlüssel mit dem Score verschlüsselt wird und beim Server dann Entschlüssechlt. Dies ist aber nicht Ideal, wenn man den Schlüssel abgreift und dann einen Neuen Score einsetzt.

noel-friedrich commented 5 months ago

Die Spiele, wie alle Befehle, laufen ausschließlich auf dem Client; der Server hat kein (das soll auch so bleiben) Wissen darüber, wenn Befehle ausgeführt werden. Jede Form von "Security" die man an der Schnittstelle implementieren will, ist keine "Security", denn mein JS Code (der inherent auf dem Client läuft) muss nach einem Spiel immer den Score hochladen können. Wenn der Befehl das kann, kann das jeder mit Lust auch tun. Auch Ansätze mit (a)symmetrischen Verschlüsselungen scheitern am gleichen Problem.

Meiner Meinung nach wäre die einzig mögliche Security die Spiele auf dem Server laufen/überprüfen zu lassen, sodass z.B. der Client am Ende eines Spiels alle Spiel-Inputs gesendet werden und der Server nachvollziehen kann, ob das Spiel so wirklich passiert ist. Bei Spielen mit Zufall (z.b. number-guess) würden die Zahlen dass natürlich irgendwie aus einer nachvollziehbaren Quelle gezogen werden (seeded random wie mit sha und der zeit als input). Das ist allerdings echt viel Aufwand! Zu viel für mich :)

Letztlich kann man Cheating bei den Highscores nicht verhindern, nur schwieriger machen. Bisher sind die Highscores noch unproblematisch und das neue Confirm-System ist nicht perfekt, aber verhindert, dass irgendwer zu viel Spaß dran hat. Und bis zum Zeitpunkt an dem das zu viel Arbeit wird, benutze ich den Ostrich algorithm.

Sorry für den Aufsatz