Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

infusion93

Frischling

  • »infusion93« ist der Autor dieses Themas

Beiträge: 19

Wohnort: Frankfurt

Beruf: Informatikstudent

  • Private Nachricht senden

1

09.06.2015, 08:43

Sicherheit von $GET in PHP

Liebe Community,

ich möchte gerne von mehreren Programmiersprache aus (welche spielen für das Problem keine Rolle) mittels einer HTTP-Connection auf einen PHP-Server zugreifen, diesem via $GET Parameter übergeben. Nun ist meine Frage, ob die Parameter, die ich übergebe, mitgelesen werden können? Wenn ich beispielsweise mit einem iPhone dem PHP-Server Parameter übergebe, kann dann jemand herausfinden, welche Parameter übergeben wurden?
Wem es interessiert, hier das Problem etwas ausführlicher:
Ich entwickle ein Spiel für mehrere Plattformen, die aber alle mit dem gleichen Server kommunizieren sollen. Übertragen werden sollen Highscores und Freundeslisten. Die Kommunikation mit dem Server sollte dennoch sicher sein. Mein Problem wäre, dass wenn beispielsweise die Highscore auf die folgende Art überträgt:

Quellcode

1
server.php?name=mustermann&highscore=102&hash=abc....yz

Kann dann jemand sehen: "Ahh, um die Highscore zu übertragen, benötigt man Name, Highscore und Hash. Der Hash scheint abc....yz zu sein, also öffne ich doch einfach mal den Browser und öffne:

Quellcode

1
server.php?name=mustermann&highscore=152415326&hash=abc....yz

Ist das wirklich möglich?

Mit freundlichem Gruß:
Marcel Gebhardt

Evrey

Treue Seele

Beiträge: 245

Beruf: Weltherrscher

  • Private Nachricht senden

2

09.06.2015, 08:51

Ich weiß es nicht, aber meine Vermutung ist "ja". Probier doch einfach mal, Wireshark zu starten, und schau, was passiert, wenn du eine Website mit Parametern öffnest wie z.B. YouTube. Dann kannste mal sehen, was alles in Klartext übertragen wird.

C-/C++-Quelltext

1
2
3
4
int main(int _argc, char** _argv) noexcept {
  asm volatile("lock cmpxchg8b %eax");
  return 0;
} // ::main
(Dieses kleine Biest vermochte einst x86-Prozessoren lahm zu legen.)

=> Und er blogt unter Hackish.Codes D:

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

3

09.06.2015, 08:54

Es kommt ganz darauf an, ob die Kommunikation verschlüsselt ist (HTTP vs. HTTPS) und ob eine sichere Verschlüsselung verwendet wird. Wenn eine "sichere" Verschlüsselung verwendet wird, kann man "nicht" mitlesen, wovon auch die Parameter betroffen sind. Wird keine oder eine unsichere Verschlüsselung, dann "kann" man mitlesen, egal ob die Parameter per GET (Teil der URL) oder POST (Teil des Anfrage-Inhalts) an den Server geschickt werden.

Bedenke aber, dass man immer dann POST-Anfragen verwenden sollte, wenn es dadurch serverseitig zu einer verändernden Aktion (Speichern von Informationen, bspw. des Highscore-Eintrags) kommt, während GET für nicht-verändernde Aktionen (Abfrage der Bestenliste) verwendet werden sollte.
Dies ist zwar für im Browser laufende Anwendungen wichtiger, der Konsistenz wegen sollte dies meiner Meinung nach aber auch bei anderen Anwendungen so fortgeführt werden.
(Schickt man im Browser ein Formular per POST ab, sollte der Browser auf eine andere (Ergebnis-)Seite weitergeleitet werden, während dies bei GET-Anfragen nicht notwendig ist. So verhindert man, dass durch reines Vor- und Zurück-navigieren weitere Änderungen an den Daten durchgeführt werden. Browser warnen auch vor erneuten Abschicken von Formulardaten, wenn es keine solche Weiterleitung gab.)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

infusion93

Frischling

  • »infusion93« ist der Autor dieses Themas

Beiträge: 19

Wohnort: Frankfurt

Beruf: Informatikstudent

  • Private Nachricht senden

4

09.06.2015, 09:14

Okay, das heißt ich muss dafür sorgen, dass selbst wenn jemand die Parameter auslesen kann, er sie trotzdem nicht modifizieren kann. Reich dafür folgende Methode?

Quellcode

1
2
3
4
5
string key = "sicherheitsschlüsselDenKeinerKennt";
string name = get_name();
int highscore = get_highscore();
string hash = md5(name + highscore + key);
open_website("server.php?name="+name+"&highscore="+highscore+"&hash="+hash);

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

5

09.06.2015, 09:15

Ich würde dir ebenfalls zu $_POST raten (und es heißt $_GET ;))

edit:
md5 ist mittlerweile nicht mehr als sicher anzusehen. Ich würde dir sha256 empfehlen. Schau dir mal hash an.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

infusion93

Frischling

  • »infusion93« ist der Autor dieses Themas

Beiträge: 19

Wohnort: Frankfurt

Beruf: Informatikstudent

  • Private Nachricht senden

6

09.06.2015, 09:27

Ich würde dir ebenfalls zu $_POST raten (und es heißt $_GET ;))

Aber wieso? Mir ist bewusst, dass es für Webseiten eine Art Norm ist, wie auch schon von Sacaldur beschrieben, aber was ist denn der signifikante Grund, es nicht mit $_GET zu machen? $_GET ist viel einfacher zu implementieren zumindest Clientside.

md5 ist mittlerweile nicht mehr als sicher anzusehen. Ich würde dir sha256 empfehlen. Schau dir mal hash an.

Danke, dass man Passwörter sehr schnell geknackt bekommt, die mit md5 verschlüsselt wurden, weiß ich, aber es handelt sich ja hier um einen ewig langen String. MD5 lässt sich ja nicht zurückverfolgen durch Algorithmen, sondern es gibt einfach Tabellen, die jedem möglichen Passwort ein MD5 zuordnen und wer dann einen MD5 kennt, kann in der Tabelle das dazugehörige Passwort finden. So habe ich das immer verstanden, oder gibt es noch einen anderen Grund?

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

7

09.06.2015, 09:50

Jemand der ernsthaft daran interessiert ist, seine gefälschten Scores online zu stellen, dürfte sich davon nicht abhalten lassen, da er sich immernoch den ausgeführten Code disassamblieren kann, um darin dann nach den entsprechenden Anweisungen Ausschau zu halten. Die meisten sollte das aber schon einigermaßen abhalten, bis jemand den richtigen "Salt" findet. (Das ist übrigens dieser "key", den du da verwendest.)
Du könntest auch gucken, ob abgesehen von solch offensichtlichen (Name + Highscore) und statischen (Salt) Werten eventuell "dynamische" Werte für die Hash-Ermittlung verwendet werden, wie die Länge des Namens, die letzte Ziffer (Einerstelle) der Highscore o. ä. Für eine absolute Sicherheit sorgt auch das nicht, es erschwert aber das Erraten des Verfahrens für die Hash-Ermittlung.

Architekt hat in der Hinsicht bereits einen wichtigen Hinweis gegeben: mit md5 ließe sich der Salt wohl schneller finden, da zu gegebenen Hashs wesentlich leichter passende Werte gefunden werden können.
Das Problem bei MD5 sind die Angriffsszenarien, die eben keinen Bruteforce und keine der beschriebenen Tabelle benötigen. Ich habe mich noch nicht ausreichend damit beschäftigt, aber da es im Grunde keinen Mehraufwand darstellt, solltest du lieber direkt SHA-256 o. ä. verwenden.

Wenn die Verwendung von POST-Anfragen schwieriger ist, solltest du auch eine andere Bibliothek umsteigen. Das sollte durchaus zum Standardumfang für HTTP-Kommunikation gehören.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Schrompf

Alter Hase

Beiträge: 1 470

Wohnort: Dresden

Beruf: Softwareentwickler

  • Private Nachricht senden

8

09.06.2015, 10:02

Es geht, und ich weiß aus eigenem Erleben auch, dass es gemacht wird. Wenn Du Dein Spiel der Welt vorstellst, werden zwangsweise die ersten Spieler andere Programmierer sein, z.B. aus diesem Forum hier. Und einige von denen sind neugierig genug, mal kurz mit Wireshark drüber zu schauen, wie Du das Leaderboard implementiert hast.

Ich habe daraufhin damals einen kleinen eigenen Code erfunden, der Bytes nach kleinen internen Tabellen rotiert und xort, um das Ergebnis dann Base64 encodet als POST-Request abzuschicken. Bisher hat das niemand geknackt, was aber sicher nur an mangelndem Interesse liegt. Wirklich ernsthafte Angreifer würde das sicher nicht aufhalten. Muss es ja aber auch nicht - es geht ja nur um ein mäßig erfolgreiches Spiel, und der Großteil der Zocker spielt über Steam, was seine eigenen Leaderboards mitbringt.
Häuptling von Dreamworlds. Baut aktuell an nichts konkretem, weil das Vollzeitangestelltenverhältnis ihn fest im Griff hat. Baut daneben nur noch sehr selten an der Open Asset Import Library mit.

infusion93

Frischling

  • »infusion93« ist der Autor dieses Themas

Beiträge: 19

Wohnort: Frankfurt

Beruf: Informatikstudent

  • Private Nachricht senden

9

09.06.2015, 10:48

Ich habe mich noch nicht ausreichend damit beschäftigt, aber da es im Grunde keinen Mehraufwand darstellt, solltest du lieber direkt SHA-256 o. ä. verwenden.

Danke, habe die SHA-256 Implementierung hinbekommen und sie gleicht der von PHP. Ich hatte zunächst nur ewig lange Algos gefunden, um SHA-256 zu implementieren, das war mir ein wenig heiter, jetzt habe ich eine schöne kurze Implementierung.

Aber gegen Angreifer bin ich damit wahrscheinlich noch immer nicht geschützt. :dash:

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

10

09.06.2015, 11:03

Da muss man den Unterschied zwischen "kein Schutz" und "zu geringer Schutz" beachten, worauch Schrompf bereits eingegangen ist. Letzteres wird bereits die einfachen Scriptkiddies davon abhalten, deine Leaderboards zuzuspammen, aber einen Profi wohl eher weniger.
Wie schon in genug anderen Themen bereits beschrieben, ist das immer ein Abwägen von Kosten und Nutzen. Um die Sicherheit zu steigern, muss man einen enormen Mehraufwand investieren. Wird das Spiel am Ende kein megamäßiger Erfolg, würde sich das auch nicht lohnen. Was du derzeitig hast und was Schrompf beschrieben hat, ist da noch sehr einfach gehalten und wehrt Versuche niedriger Stufen ab.
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige