Benutzerdatenbank abfragen, wie am sichersten?



  • Hallo,

    ich bin ein ziemlicher Neuling in Sachen C++, also entschuldigt bitte schon im Voraus für meine Unwissenheit. 😃

    Ein paar Erfahrungen habe ich schon sammeln können, der übliche Anfängerkram eben: Hallöchen Welt, Bau Dir n Kommandozeilenbasierten Taschenrechner, ... und sogar ein kleines Textbasiertes Spiel habe ich zusammenbasteln können. Nichts besonderes, aber immerhin. Für dieses Spiel wollte ich nun eine Punktetabelle und dazu natürlich eine Benutzerdatenbank anlegen, gewählt hab ich dafür MySQL.
    Was ich erreichen möchte ist folgendes:

    Nutzer startet das Spiel und muss sich zuerst mit seinen Daten (Name und Passwort) einloggen, nur dann kann er spielen.

    Die Frage ist: Wie mache ich das am Besten, einfachsten und sicher soll es auch irgendwie sein.
    Meine Problem dabei ist folgende:

    Wie frage ich ab, ob der Benutzer die richtigen Daten angegeben hat?
    Die MySQL-Verbindung mit Logindaten direkt im Programmcode zu speichern halte ich für leicht fahrlässig (hab mal gehört, gewiefte Leute können damit Unfug treiben)?
    Mein Lösungsansatz war: Eine Verbindung zu einer PHP-Seite herstellen und PHP die Abfrage machen lassen, so dass der Client nur noch mitgeteilt bekommt: Erfolgreich/Nicht erfolgreich
    Das würde zwar gehen, nun hab ich nach etwas Googlen aber gesehen dass man auch hier aufpassen muss (worauf genau stand da leider nicht..., deswegen die Frage an euch?)

    Also so ein paar Ansätze/Ideen welche Möglichkeiten es gibt, wie man die am sichersten umsetzt bzw. worauf ich bei sowas besonders achten sollte wäre sehr nett.



  • Dieser Thread wurde von Moderator/in SeppJ aus dem Forum C++ (alle ISO-Standards) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Die Frage ist: Wie mache ich das am Besten, einfachsten und sicher soll es auch irgendwie sein.

    gegen welche Personen möchtest du absichern

    ein einfacher Benutzer (ohne IT-Kenntnisse, kein Hex-Editor usw.)
    Da kannst du alles in deinen Code packen

    jemand der sich mit einem Hex-Editor auskennt (mehr nicht):
    Da kannst du dein Password verschlüsselt in deinem Code ablegen

    ein Crack der gerne Programme zerlegt und das unbedingt erreichen will:
    Da hast du fast keine Möglichkeit - er wird sich den Assemblercode anschauen und alle deine Tricks umgehen (auch wenn PHP geht-nicht liefert, macht er in deinem Verarbeitungscode ein geht-doch draus, usw.)



  • Am liebsten würde ich ja gleich lernen wie ich was gegen alle 3 tun kann.
    Das ist aber nicht möglich, wenn ich das so richtig sehe?
    Aber wie machen das dann große Softwareunternehmen, die geben sich doch sicher auch nicht einfach so geschlagen?

    Ich bin mir zwar sicher, bei mir wird sich da keiner auch nur Ansatzweise soviel Mühe geben, aber interessieren würde es mich trotzdem.



  • Hi,

    Zumindest beim Passwort kannst du ja für die Länge und die ascii-Werte der einzelnen Buchstaben bzw. Zeichen jeweils eine adere Formel nehmen um sie zu berechnen.

    Gruß Mümmel



  • Naja bei "richtig" machen, gibt es mehrere Dinge zu beachten ....

    Zuerst solltest du zwischen Accountsicherheit und Passwortsicherheit unterschieden.

    Das erste ist, wie sicher der Zugrif auf deine geschuetzte Ressource ist.
    Das zweite ist, wie sicher das Passwort selber ist, auch nach erfolgten einbruch.

    fürs erste gibts Verschlüsselungsverfahren mit synchroner und asynchroner Verschluesselung.
    Für 2te gilt, niemals mit Passwortern direkt, sondern nur mit hashes arbeiten.

    Wenn dich das wirklich intressiert, solltest dich in die Cryptologie einlesen, also nicht die mathematischen Grundlagen sondern eher Hashes, synchrone und assynchrone verfahren, Key Austausch, ...
    Wenn das geschnallt hasst, ists recht einfach ne Crypto lib (libcrypto z.b.) zu verwenden, oder du nimmst was fertiges.

    Mein Lösungsansatz war: Eine Verbindung zu einer PHP-Seite herstellen und PHP die Abfrage machen lassen, so dass der Client nur noch mitgeteilt bekommt: Erfolgreich/Nicht erfolgreich

    mit php gibts da sicher auch was ...
    Aber nen Java container (jetty, tomcat, glassfish) aufsetzen und nen Sessionorientiertes Protokoll verwenden das die daten aus ner lokalen DB holt, da gibts ne menge möglichkeiten und fertige Lösungen ...

    Willst selber nen Protokoll mit Passwortabfrage auf Basis von Sockets bauen, bietet sich SSL an (und selber natürlich nur gehashte Paswörter verwenden) ...

    Ciao ...



  • 'richtig' machst du es, wenn die (spiel-)logik auf dem server läuft. Nur so kann das umgehen des schutzes verhindert werden.



  • richtig' machst du es, wenn die (spiel-)logik auf dem server läuft. Nur so kann das umgehen des schutzes verhindert werden.

    Sorry, aber diese Information bringt mich irgendwie gar nicht weiter... Mir geht es darum, wie ich generell Daten zwischen Client und Server austausche und zwar so, dass ich dabei möglichst wenig Angriffsfläche biete und gleichzeitig möglichst geringe Manipulationsmöglichkeiten.
    Woher bekommt denn der Server die Informationen? Die zaubert er sich ja nicht her, die bekommt er vom Client, also vom Benutzer.

    Es ist erstmal unerheblich für mich, ob der Benutzer seinen Highscore aufs maximum hochcheaten könnte. Für mich dient dieses Spiel nur als Übungsprogramm weil ich da eben sehr viele neue Sachen lernen kann. Und nun stellt sich mir erstmal die Frage für die Lösung eines solchen Benutzersystems.

    Die Spiellogik auf den Server auszulagern, das kommt irgendwann später nochmal dazu.

    Wenn dich das wirklich intressiert, solltest dich in die Cryptologie einlesen, also nicht die mathematischen Grundlagen sondern eher Hashes, synchrone und assynchrone verfahren, Key Austausch, ...
    Wenn das geschnallt hasst, ists recht einfach ne Crypto lib (libcrypto z.b.) zu verwenden, oder du nimmst was fertiges.

    Etwas in derart meinte ich. Dazu werd ich mir auf jedenfalls mehr Informationen suchen. Ich danke für den Tipp. 🙂

    Dass ich Passwörter nicht im Klartext in die DB schreibe ist mir bewusst gewesen. Danke trotzdem. 😃



  • Statt selbst etwas zusammenzufrickeln kannst du auch einfach auf https setzen. Netzwerklibs mit https gibts einige, zb cpp-netlib.
    Dann noch ein bisschen php drumherum und fertig 🙂
    Der client sendet seine logindaten zum server, welcher diese dann verifiziert. Dann können spielstanddaten etc abgeholt werden. Zum wiedererkennen des clients können http-cookies benutzt werden, php bietet dahingehend einfach zu bedienende funktionen an.


  • Mod

    roflo schrieb:

    Der client sendet seine logindaten zum server, welcher diese dann verifiziert. Dann können spielstanddaten etc abgeholt werden. Zum wiedererkennen des clients können http-cookies benutzt werden, php bietet dahingehend einfach zu bedienende funktionen an.

    Erst einmal sollte der Client aber sicher stellen, dass der Server auch wirklich der ist, für den er sich ausgibt.



  • Statt selbst etwas zusammenzufrickeln kannst du auch einfach auf https setzen

    oder SSL, wenn ständiges auf und abbauen der Verbindung Probleme bereitet (latenz, Leistungsverbrauch auf der cpu)

    Ciao ...



  • Der Client kann auch einfach nur legale Aktionen schicken. Statt "die Figur hat sich 100m nach links bewegt" schickt der Client einfach "User drückt linke Pfeiltaste".

    So umgeht man auch viele Probleme automatisch 🙂



  • Hab eine (fast)fertige Lösung gefunden, weiß nicht ich die Seite hier posten darf, deswegen lass ich es mal.
    Statt dem Umweg über PHP gibt es nun ein Loginscript in C++ direkt auf dem Server, das scheint auch zu funktionieren, der Client bekommt nur mitgeteilt ob die Daten verifiziert werden konnten oder nicht.

    Der Client kann auch einfach nur legale Aktionen schicken. Statt "die Figur hat sich 100m nach links bewegt" schickt der Client einfach "User drückt linke Pfeiltaste".

    Aber nehmen wir mal irgendein beliebiges MMORPG, dort würden die Spieler dann ja hunderte Informationen in kürzester Zeit an den Server senden. Wäre das nicht extrem aufwendig für den Server?


  • Mod

    DavidWebb schrieb:

    Aber nehmen wir mal irgendein beliebiges MMORPG, dort würden die Spieler dann ja hunderte Informationen in kürzester Zeit an den Server senden. Wäre das nicht extrem aufwendig für den Server?

    Ich glaube, du überschätzt das Datenvorkommen gewaltig. Ein normaler Mensch macht vielleicht 1-2 Aktionen pro Sekunde, wenn es hitzig wird. Ein extrem schneller Mensch eventuell auch mal 5. Oder sind das für dich schon hunderte Aktionen in kürzester Zeit?



  • Is die Frage ob er pro Spieler oder pro Shard/Instanz gemeint hat.

    @DavidWebb
    "Irgendein beliebiges MMORPG" ist lustig. Der Server von "irgendeinem beliebigen MMORPG" ist normalerweise nicht in PHP geschrieben. Und ich würde davon ausgehen dass da auch Leute dransitzen die genügend Erfahrung etc. haben. Ein paar hundert Requests pro Sekunde dürfen auf jeden Fall kein Problem sein. Nichtmal ein paar tausend. Also falls du insgesamt gemeint hast.

    Und falls du pro Spieler gemeint hast gilt natürlich das was SeppJ geschrieben hat.



  • SeppJ schrieb:

    DavidWebb schrieb:

    Aber nehmen wir mal irgendein beliebiges MMORPG, dort würden die Spieler dann ja hunderte Informationen in kürzester Zeit an den Server senden. Wäre das nicht extrem aufwendig für den Server?

    Ich glaube, du überschätzt das Datenvorkommen gewaltig. Ein normaler Mensch macht vielleicht 1-2 Aktionen pro Sekunde, wenn es hitzig wird. Ein extrem schneller Mensch eventuell auch mal 5. Oder sind das für dich schon hunderte Aktionen in kürzester Zeit?

    Ich hab früher auch solche Spiele gespielt und wenn ich daran so zurückdenke, dann habe ich schon im alltäglichen Situationen mehr Tasten gedrückt, im Player vs Player: i.d.R drückt man die Bewegungstasten, die Schlagtasten, Fertigkeitstasten, Tasten für verschiedene Potts usw. usw. und das alles ziemlich hektisch. Wenn ich alle diese Tastendrücke an den Server sende um sie zu validieren (z.B um einen Speedhack auszuschließen, zu überprüfen ob der Client seine bzw. die Fertigkeit überhaupt nutzen kann, ...) und das bei hunderten oder tausenden Spielern, ...?
    Dann kommt mir das ziemlich viel für einen Server vor - mag sein, dass ich mir da wirklich zu viel sorgen drum mache und sowas eigentlich kein Problem für so einen Server darstellen sollte, ich lass mich da gerne eines besseren belehren.

    Der Server von "irgendeinem beliebigen MMORPG" ist normalerweise nicht in PHP geschrieben.

    Dafür ist PHP ja auch nicht gedacht, falls Du auf meine Frage bzgl. Login mit PHP anspielst: Mir ging es nur um den Login an sich und wie gesagt: Mittlerweile habe ich das auch ber C++ direkt auf dem Server gelöst.


  • Mod

    DavidWebb schrieb:

    SeppJ schrieb:

    DavidWebb schrieb:

    Aber nehmen wir mal irgendein beliebiges MMORPG, dort würden die Spieler dann ja hunderte Informationen in kürzester Zeit an den Server senden. Wäre das nicht extrem aufwendig für den Server?

    Ich glaube, du überschätzt das Datenvorkommen gewaltig. Ein normaler Mensch macht vielleicht 1-2 Aktionen pro Sekunde, wenn es hitzig wird. Ein extrem schneller Mensch eventuell auch mal 5. Oder sind das für dich schon hunderte Aktionen in kürzester Zeit?

    Ich hab früher auch solche Spiele gespielt und wenn ich daran so zurückdenke, dann habe ich schon im alltäglichen Situationen mehr Tasten gedrückt, im Player vs Player: i.d.R drückt man die Bewegungstasten, die Schlagtasten, Fertigkeitstasten, Tasten für verschiedene Potts usw. usw. und das alles ziemlich hektisch. Wenn ich alle diese Tastendrücke an den Server sende um sie zu validieren (z.B um einen Speedhack auszuschließen, zu überprüfen ob der Client seine bzw. die Fertigkeit überhaupt nutzen kann, ...) und das bei hunderten oder tausenden Spielern, ...?
    Dann kommt mir das ziemlich viel für einen Server vor - mag sein, dass ich mir da wirklich zu viel sorgen drum mache und sowas eigentlich kein Problem für so einen Server darstellen sollte, ich lass mich da gerne eines besseren belehren.

    Wenn du regelmäßig mehr als 5 pro Sekunde schaffst, dann würde ich mich an deiner Stelle mal bei einem prominenten Esportsteam bewerben, vor dir liegt eine steile Karriere.

    Wie viele Leute sind denn so auf einem MMORPG-Server? Ein paar Tausend? Vielleicht sogar noch in Regionen unterteilt, so dass es nur ein paar Dutzend bis Hundert pro Region sind? Selbst mit tausenden von Spielern sind das immer noch nur tausende von Anfragen gleichzeitig. Das ist doch so gut wie nichts für einen Computer. Wie hustbaer schon sagte, wird ein MMORPG gewiss nicht in LAMP implementiert sein, sondern eine Softwarelösung ohne viel Overhead.

    Viel interessanter ist die Frage, wie der Server an tausend Spieler die nötigen Informationen über das Handeln der anderen 999 Spieler verschickt.



  • Naja, die meisten Spiele Clients die ich kenne, cachen extrem die daten ...
    d.h. man bewegt sich wie lokal, und parallel dazu werden die Daten versucht am Server zu synchronisieren.

    Falls das Synchronisieren mal fehlschlägt, kann der Client auch aktionen "zurucknehmen". Bei miesen Implementationen freut man sich dann immer über den GummiLeine Effekt ^^

    Denk mal das Clients heutzutage viel und auch dynamisch abfangen. bei ner guten verbindung wird viel und oft synchronsiert, bei ner schlechten eher weniger ^^

    Selbst mit tausenden von Spielern sind das immer noch nur tausende von Anfragen gleichzeitig. Das ist doch so gut wie nichts für einen Computer.

    Früher waren die Server geclustert (Zonen) ... also rechenleistung denk ich mal war schon bissi problemtatisch. Keine Ahnung wie es heutzutage ist.
    Wobei ich denk das eher das Netzwerktechnik und Verhalten problematisch ist ...
    1000 offene sockets sind schon nen Wort. Über verschluesselung brauch ma da nicht nachzudenken, über http auch ned ^^
    TCP wird sicher sportlich, denk der standard wird UDP sein, um Laufzeit daten zu übermitteln. Managment sicher weiterhin über tcp ...

    Aber wenn ich heutzutage manche Spiele sehe, glaube ich der Server läuft als App aufm handy vom manager ^^

    Ciao ....



  • RHBaum schrieb:

    1000 offene sockets sind schon nen Wort. Über verschluesselung brauch ma da nicht nachzudenken, über http auch ned ^^

    Sorry, aber viel mehr als ein herzliches LOL ist das nicht wert.

    1000 offene Connections schaffte sogar mein alter PC mit nem nicht übermässig professionell entwickelten Java Programm. Muss jetzt bald 10 Jahre her sein. Daneben hab' ich noch ganz normal gesurft, entwickelt - nix davon zu bemerken.



  • RHBaum schrieb:

    TCP wird sicher sportlich, denk der standard wird UDP sein, um Laufzeit daten zu übermitteln. Managment sicher weiterhin über tcp ...

    TCP ist nur doof wegen der Latenz.



  • Um es für mich kurz und verständlich zu machen:

    Ich muss mir also keine Sorgen um "zu viele" Daten machen, so n Server steckt das locker flockig weg?

    TCP ist nur doof wegen der Latenz.

    Benutzt man TCP nicht eh nur bei wichtigen Daten?
    Also um auf das Beispiel mit den gedrückten Tasten zu kommen: Wenn dort eine Information verloren geht, wäre es nicht sooo schlimm, also würde ich dort UDP verwenden, wohingegen ich beim Login TCP verwenden würde? Oder hab ich das falsch verstanden mit den Protokollen?


Anmelden zum Antworten