[vielleicht gelöst] Online Highscore Liste



  • Hallo zusammen,

    ich hab ein kleines Spielchen programmiert (in C++). Am Ende des Spiels wird ein Highscore ausgewertet, der wird dann auch mit einem bestimmten Format in eine Datei geschrieben.

    Ich habe mir überlegt, es wäre ein interessantes Projekt eine online Highscoreliste zu machen. Ich habe mir nun schon eine Website erstellt und gehostet. Ich kann dort mit MySQL und PHP arbeiten.

    Meine Vorstellung:

    ------------------|    |------------|    |----------------------------------|
    |                 |    |            |    |                                  |
    | Spiel errechnet |--->| Blackbox   |--->| MySQL Anfrage fügt neuen Eintrag |
    | Highscore       |--->|            |--->| mit dem Highscore hinzu (Server) |
    |                 |    |------------|    |                                  |
    |-----------------|                      |----------------------------------|
    

    Ich brauch wirklich nur irgendwelche Stichworte, ich recherchiere dann schon alles selber aber... Ich hab eben absolut keinen Plan. Hab schon gegoogelt nach Sachen wie "Execute PHP via HTTP Request" oder "HTTP MySQL query"... Wie ihr seht war mein intuitiver Gedanke, dass ich das über eine Art HTTP Request erreiche.

    Ich wäre unheimlich froh, wenn mich jemand auf die richtige Spur bringen könnte, und mir sagen kann welches Protocoll/Funktion/etc. ich da verwenden muss.

    LG
    HarteWare

    EDIT: Ich hatte grad noch einen Spontanen Einfall: Ich lagere auf dem Server ebenfalls die highscoredatei. Diese wird dann z.B. ergänzt durch die highscores der Datei des localen Spiels.
    Wenn dann jemand auf "view highscores" klickt, wird dann praktisch die neue Highscoredatei geladen (oder irgendwie in die SQL datenbank übertragen). Das Ganze würde dann nach meiner Vorstellung über FTP laufen.

    taugt das?

    Edit2: Ich bin auf die Spur gekommen, dass ich vielleicht etwas wie eine "add_highscore.php" seite brauche. Die kann ich dann vielleich irgendwie mit dem programm "auftrufen", die Daten irgendwie übertragen und so den highscore "übertragen"... hab da in der Schule schonmal was mit Formularen und _POST/\_POST/_GET gemacht.. evtl. get das auch mit z.B. PocoNet libraries? weiß aber nicht Näheres dazu.

    Edit3: Soo... Ich hab mal meine Spur weiterrecherchiert. Habe es also geschafft, via HTTP Request an eine php Datei eine SQL insertion zu erreichen. Ich denke somit ist die größte Hürde übersprungen, und ich bekomme den Rest allein hin.

    Falls jemand in der Zukunft dasselbe Problem hat wie ich:

    .php Datei auf dem Server:
    
    mit datenbank verbinden, dann aus $_GET bzw. $_POST die gewünschten Daten auslesen, und eine query machen (INSERT ... INTO ...).
    Kann dann z.B: so aussehen:
    <?php
    		$conn = @mysqli_connect("localhost", "<username>", "<passwort>", "<Datenabank>") 
    			or die("Connection failed: " . mysqli_connect_error());
    
    		$d = $_GET["data"];
    		$sql = "INSERT INTO <tabelle> (<Wert>) VALUES ('$d')";
    		if (mysqli_query($conn, $sql)) {
    			echo "Funst";
    		} else {
    			echo "Error: " . mysqli_error($conn);
    		}
    
    		mysqli_close($conn);
    	?>
    
    // C++ Code:
    #include <Poco/Net/HTTPClientSession.h>
    #include <Poco/Net/HTTPRequest.h>
    #include <Poco/Net/HTTPResponse.h>
    #include <Poco/URI.h>
    
    void foo() {
        unsigned int data { 100 };
        Poco::Net::HTTPClientSession session { "<domain>" }; // z.B: google.de 
        Poco::URI uri;
        uri.setPath("/<dieObenErwähnteDatei>.php");  // Pfad zur Datei, kann variieren
    
        // das wird dann dem GET bzw POST arras hinzugefügt (bei mir landets nur im GET, weiß noch nicht weshalb
        uri.addQueryParameter("data", std::to_string(highscore));
    
        Poco::Net::HTTPRequest req { "HTTP_POST", uri.toString() };
        Poco::Net::HTTPResponse response;
    
        session.sendRequest(req);
    
        // damit man was sieht
        std::cout << session.receiveResponse(response).rdbuf() << std::endl;
        // für Näheres über die Poco Klassen und Funktionen einfach in der Doku nachschauen
        // dieser Code ist als Pseudocode zu betrachten
    }
    

    Bin für Verbesserungsvorschläge offen!





  • Hey,

    vielen Dank für deine Antwort.

    Ich bin mir allerdings nicht sicher, inwiefern das jetzt sinnvoll ist.

    Einfach ein Wikipedia Link hingeklatscht, ohne auch nur ein Kommentar. Selbst wenn ich etwas damit anfangen wollte, würde es mir so viel Mühe machen, wie es mir auch machen würde, wenn ich ohne diesen hilfreichen Link daran arbeiten würde.

    Dabei ging es mir vorerst mal garnicht darum, Sicherheitslücken zu schließen. In diesem Stadium kann es mir egal sein, wenn ein Witzbold ein DROP table ausführt.

    Es ging erstmal lediglich darum, überhaupt mal die scores an einen Server zu übertragen.

    Natürlich werde ich es aber mal als Verbesserungsvorschlag im Hinterkopf behalten. Sollte mein Spiel jemals ein Hit werden, werde ich mir sicherlich gedanken über solche Sicherheitslücken machen.

    LG
    HarteWare


  • Mod

    Nein, das taugt alles nichts. Hab nur bis "Edit" gelesen - aber alles ganz falsch.

    Du definierst am Server eine Schnittstelle per REST oder SOAP oder was du willst, ich empfehle REST.

    Über diese Schnittstelle überträgt die lokale Anwendung Daten an den Server und lädt darüber auch die Highscore liste.

    Das ist trivial.

    Der tricky part entsteht dadurch, dass du verifizieren willst welche Highscores gültig sind und welche "gehackt" sind. Das geht nicht gut. Hier kann man nur Aufwand betreiben die Infos gut zu verstecken.

    zB kannst du die Daten Asymmetrisch verschlüsseln und den Schlüssel in deinem Programm irgendwo verstecken - das ist aber alles knackbar was du hier machen willst.

    Eine User Authentifizieren lässt dich das ganze dann besser Nachvollziehbar machen um so Leute sperren zu können.

    Und SQL Injections sind Anfänger fehler. Verwende PDO und prepared Statements, dann machst du keine peinlichen Fehler.



  • Hi,

    danke für deine Rückmeldung @Shade Of Mine.

    Ich werds auf jeden Fall mal versuchen mit der von dir genannten Methode umzusetzen.

    Zum Thema Gehackte Highscores: Bisher habe ich einfach dazu einen hash gespeichert und diese dann verglichen (für das Speichern auf dem PC, z.B. in "highscores.txt"), kann ich das weiterhin so machen, oder ist das schlecht weil entweder die hash-Funktion eine andere sein wird, oder der Aufwand das zu umgehen zu gering ist, oder ist das einfach generell eine schlechte Methode?

    Ich muss halt realistisch bleiben: Bei mir gehts um kein großes Projekt, wo ich mir jetzt wirklich gedanken um professionelle Hacker mache (z.B. Irgend eine Unternehmenswebsite mit Kundendaten etc.). Ich möchte aber natürlich das Ganze schon gescheit machen.

    Ich muss mich erstmal in das Ganze Zeug einlesen. Ich denke ich melde mich dann nochmals.

    LG
    HarteWare

    Edit:
    REST: ist http://www.restapitutorial.com ok?
    - mit "Schnittstelle definieren". Ist das so gemeint, dass ich bestimmte (PHP) Scripte habe, die für bestimmte HTTP Anfragen (GET, POST, ...) mit bestimmten Daten etwas bestimmtes machen? Und sollte ich dabei wirklich mit JSON (oder XML) arbeiten? Ist es denn "schlechter Stil", wenn ich jetzt z.B. einfach nur 2 Werte zurück sende?
    Ich hab auch mal versucht etwas über Authentifizierung herauszufinden. Bin dann auf OAuth gestoßen. Jedoch weiß ich da 1. nicht, ob nun wirklich 1 oder 2 "besser" ist, und so ganz verstanden hab ichs auch nicht, geschweige denn bin ich in der Lage das OAuth von Poco in meinem client mit dem PHP OAuth auf dem Server zu kombinieren. Ich habe es außerdem so mitbekommen, dass dies vor allem für Szearien wie "Ich möchte über Website A mit Daten für Website B auf Website B zugreifen" nützlich ist, weiß aber nicht, wie das mir für "Ich möchte auf Daten von Website B zugreifen" oder "Ich möchte Daten von Website B ändern" nützt.
    Ich möchte auch darauf hinweisen, dass ich keine Benutzeraccounts verwende für mein Programm.


Anmelden zum Antworten