kostenloser Webspace werbefrei: lima-city


MySQL Passwort vor Dritten schützen?

lima-cityForumProgrammiersprachenProgrammieren mit .NET & Mono

  1. s******i

    hackyourlife schrieb:
    Natürlich bekommt der Angreifer das MySQL-Passwort nicht, dafür kann er SQL-Befehle direkt und ohne Passwort ausführen... das ist das Problem.

    Wie denn, wenn er keine Queries an den MySQL-Server schicken, sondern einfach nur die WebServices nutzen kann?

    Aber jetzt verstehe ich das Problem des TS ;) Mir ist zwar schleierhaft, warum der TS eine DB braucht, um Daten nur für 15 Minuten zu persistieren, aber egal. Natürlich sollte dann jeder Client eine Informationen im Header der Server-Response über die ID und ein temporäres Passwort erhalten. Am einfachsten wird das wohl mit den Sessions in PHP gehen.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Du brauchst dazu nicht einmal eine neue Netzwerkkarte einbauen... es reicht wenn du der Netzwerkkarte eine neue MAC-Adresse verpasst (was softwaremäßig funktioniert)... und das funktioniert in weit weniger als 15 Minuten

    Schon, aber das würde dann ja bewusst passieren. =)
    Wer sich durch solche Aktionen für 15 Minuten selbst aussperrt, ist dann auch selber Schuld.

    Was deine Idee mit der Session betrifft....warscheinlich habt Ihr durch frühere Fragen schon gemerkt, dass ich nicht unbedingt ein Händchen für Client--->Server Programmierung habe, deshalb frage ich mal ganz frech, wie denn das gehen müsste? =)

    dabei wird im Kommentar die Stringlänge von 32 vorgetäuscht und ansonsten wieder per

    OR 1 = 1

    die Sicherheit umgangen...

    Hast Recht, Kommentare hatte ich noch nicht bedacht, aber auch die lassen sich im Übergabewert abfangen.
    Erlaubt werden für den MD5 Hash ja nur Ziffern und Buchstaben, keine Slashes und Sonderzeichen.
    Das Script würde den Wert nicht als gültiges MD5 ansehen.

    Eine zusätzliche OR-Anweisung sollte bei einem escapeten String eigentlich fehlschlagen, wenn sie zusammen mit dem Wert übergeben wird, liege ich da richtig?
    Ausserdem besteht auch hier wieder das Problem für den Angreifer, das zusammen mit der OR-Anweisung ein "=" mitgeliefert wird, was für einen ungültigen MD5 Wert sorgt.

    Mir ist zwar schleierhaft, warum der TS eine DB braucht, um Daten nur für 15 Minuten zu persistieren, aber egal.

    Naja, was sonst?

    Beitrag zuletzt geändert: 17.5.2012 14:59:55 von adelwoehrer
  4. Prinzipiell würde ich vorschlagen, sowas niemals direkt über den SQL-Server zu machen, sondern immer über eine Serverseitig API. ( Beispielsweise PHP ) Wenn du deinen Nutzern keine Registrierung aufbürden willst, kannst du das halt automatisch vom Programm veranlassen lassen. Du erstellst einen einen String mit einer Zeichenlänge von x ( Beispielsweise 256) und sendest die an eine
    api.php?registerid=<deinstring>
    Die Api registriert also den String und danach kannst du dir deine Daten beliebig ausgeben lassen, indem du beispielsweise sagst
    api.php?id=<deinstring>&action=foobar
    . Danach gibt dir die Api halt die Daten raus, die für den jeweiligen benutzer gespeichert wurden, ohne, dass da SQL-Passwörter im Spiel sind. Wenn dann der letzte Zugriff x Sekunden her ist, laufen die Daten ab und werden verworfen.

    Da die Zeichenkette zufallsgeneriert wurde, kann der Server/Client diesen beliebig lange speichern und am Ende verwerfen. Du könntest es auch beliebig durch Benutzernamen und Passwörter ergänzen - im Grunde kannst du es machen wie du willst. Je nach Sicherheitsanspruch.
  5. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    adelwoehrer schrieb:
    Schon, aber das würde dann ja bewusst passieren. =)
    Wer sich durch solche Aktionen für 15 Minuten selbst aussperrt, ist dann auch selber Schuld.
    Klar, aber was passiert, wenn sich jemand die MAC einer anderen Person besorgt die auch dein Programm verwendet?

    adelwoehrer schrieb:
    warscheinlich habt Ihr durch frühere Fragen schon gemerkt, dass ich nicht unbedingt ein Händchen für Client--->Server Programmierung habe, deshalb frage ich mal ganz frech, wie denn das gehen müsste? =)
    Du machst bei der ersten Verbindung mit PHP eine Session auf, dort speicherst du dir irgendwas zu dem Client (was er z.B. aus der Datenbank abfragen darf).
    Später schickt der Client immer seine Session-ID mit, die er bei der 1. Anfrage erhalten hat; anhand dieser kann das PHP-Script dann entscheiden wer das ist und was er darf.

    adelwoehrer schrieb:
    Eine zusätzliche OR-Anweisung sollte bei einem escapeten String eigentlich fehlschlagen, wenn sie zusammen mit dem Wert übergeben wird, liege ich da richtig?
    Wenn du richtig vorgehst ist das wirklich unmöglich...
    $query = 'SELECT irgendwas WHERE mac = \'' . mysql_real_escale_string($mac) . '\'';
    Wenn du keine Anführungszeichen nützt bringt dir das escapen nicht viel...

    kelserific schrieb:
    Wenn du deinen Nutzern keine Registrierung aufbürden willst, kannst du das halt automatisch vom Programm veranlassen lassen.
    Allerdings sollte der Server dem Client die ID geben und nicht der Client sich selbst, da es sonst die Möglichkeit gäbe, dass ein Client zufällig die gleiche ID hat wie ein anderer...
  6. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Klar, aber was passiert, wenn sich jemand die MAC einer anderen Person besorgt die auch dein Programm verwendet?

    Gut, das wäre dann der nächste Punkt....das wird zwar langsam etwas aufwendig für den Angreifer, aber Session IDs wären da wohl wirklich die bessere Lösung.

    Du machst bei der ersten Verbindung mit PHP eine Session auf, dort speicherst du dir irgendwas zu dem Client (was er z.B. aus der Datenbank abfragen darf).
    Später schickt der Client immer seine Session-ID mit, die er bei der 1. Anfrage erhalten hat; anhand dieser kann das PHP-Script dann entscheiden wer das ist und was er darf.

    Was mir hier noch durch den Kopf ginge....könnte man diese Session ID nicht abfangen, wenn sie vergeben wird? (Wireshark)
  7. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    adelwoehrer schrieb:
    Was mir hier noch durch den Kopf ginge....könnte man diese Session ID nicht abfangen, wenn sie vergeben wird? (Wireshark)
    Wenn du dir ein SSL-Zertifikat leistest, dein Server HTTPS unterstützt und du den Traffic über HTTPS leitest ist das nicht möglich.

    Unverschlüsselt hingegen ist das sehrwohl möglich...

    Ansonsten könntest du dir die Session-Funktionen auch selber bauen (nicht die Sessions von PHP nutzen) und das mit OpenSSL verschlüsseln... das würde dann sogar auf lima-city funktionieren.
  8. adelwoehrer schrieb:
    Was mir hier noch durch den Kopf ginge....könnte man diese Session ID nicht abfangen, wenn sie vergeben wird? (Wireshark)
    Richtig. Aber da du den Zugriff mit der API beliebig einschränken kannst ( Da du ja jede Option erst implementieren musst ) Würde der Benutzer nur an Daten kommen, an die auch das Programm kommt. Und die Infos die das Programm hat, kannst du über einen Speicher-Dump sowieso immer auslesen.
  9. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    kelserific schrieb:
    adelwoehrer schrieb:
    Was mir hier noch durch den Kopf ginge....könnte man diese Session ID nicht abfangen, wenn sie vergeben wird? (Wireshark)
    Richtig. Aber da du den Zugriff mit der API beliebig einschränken kannst ( Da du ja jede Option erst implementieren musst ) Würde der Benutzer nur an Daten kommen, an die auch das Programm kommt. Und die Infos die das Programm hat, kannst du über einen Speicher-Dump sowieso immer auslesen.
    Nur wenn ich beispielsweise deine Session-ID abfangen würde könnte ich auch deine Daten auslesen, und genau das soll vermieden werden.
  10. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Und wie wäre theoretisch eine Lösung, die auf beiden Vorschlägen basiert?
    Also sowohl Session ID, als auch MAC Adresse?
    Noch eindeutiger könnte man einen PC doch beinahe schon nicht mehr identifizieren.

    Verschlüsselt wird dann noch zusätzlich nicht über MD5, sondern über SHA512, was 2 Strings mit je 128 Zeichen ergibt, die beide stimmen müssten.

    Beitrag zuletzt geändert: 17.5.2012 15:49:02 von adelwoehrer
  11. hackyourlife schrieb:
    Nur wenn ich beispielsweise deine Session-ID abfangen würde könnte ich auch deine Daten auslesen, und genau das soll vermieden werden.
    Nun, wie möchtest du das anstellen? Ohne einen MITM-Angriff wird das ziemlich schwierig. Und als Man-In-The-Middle kannst du auch SSL aushebeln, da du ja bei jeden Datenaustausch mithören und manipulieren kannst. ( Auch den Austausch von Schlüsseln )
  12. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    adelwoehrer schrieb:
    Und wie wäre theoretisch eine Lösung, die auf beiden Vorschlägen basiert?
    Eigentlich sinnlos, da du bei einer verschlüsselten Verbindung und Sessions sowieso keine Chance hast an die Daten ranzukommen... also nur unnötiger Aufwand.

    kelserific schrieb:
    Und als Man-In-The-Middle kannst du auch SSL aushebeln, da du ja bei jeden Datenaustausch mithören und manipulieren kannst. ( Auch den Austausch von Schlüsseln )
    Nicht ganz, da du dadurch den Fingerabdruck des Zertifikats änderst...
    Jetzt hast du 2 Möglichkeiten:
    1) du speicherst den Fingerabdruck in deinem Programm und vergleichst den
    2) du kaufst dir ein signiertes Zertifikat

    Beitrag zuletzt geändert: 17.5.2012 15:50:26 von hackyourlife
  13. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Also endgültige Lösung: OpenSSL und Session?
  14. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    adelwoehrer schrieb:
    Also endgültige Lösung: OpenSSL und Session?
    Ja, bei OpenSSL musst du allerdings den Fingerabdruck des Zertifikats in deinem client-seitigen Programm hardcoden um dich vor gefälschten Zertifikaten zu schützen... und wenn der Fingerabdruck des Zertifikats nicht mit dem hardgecodeten zusammenpasst gibst du eine Fehlermeldung aus (z.B. "die Verbindung wird belauscht").
    Dann muss ein Angreifer immerhin dein Programm verändern und das veränderte Programm verbreiten...
  15. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Nagut, dann mach ich das so. =)
    Hätte nicht gedacht, dass man da nochmal auf eine "wirklich" sichere Lösung kommt, die sich nicht mit genug Aufwand aushebeln lässt.

    Danke an Alle für die Vorschläge.
    Problem sollte gelöst sein.

    Beitrag zuletzt geändert: 17.5.2012 16:00:23 von adelwoehrer
  16. s******i

    adelwoehrer schrieb:
    Mir ist zwar schleierhaft, warum der TS eine DB braucht, um Daten nur für 15 Minuten zu persistieren, aber egal.

    Naja, was sonst?

    Wie wäre es denn, wenn du die Daten, die du an den Webservice schickst, sofort verarbeitest und das Ergebnis zurückschickst? Hier vielleicht ein Beispiel:
    Du sendest an den Server folgende Anfrage: "Suche alle Geschäfte im Umkreis von 1km" vielleicht in der Form von
    <storeQuery ratio="1" limit="1000">
      <geoData lat="20" lng="20/>
    </storeQurey>

    Als Antwort gibt der Server eben alle Geschäfte zurück. Vielleicht dieser Form:
    <storeList>
      <store name="coffe shop" description="..." rate="5.6"><geoData /></store>
      <store name="eis 2000" description="..." rate="2.5"><geoData /></store>
    </storeList>

    Diese Response kann dann dein C#-Client dann problemlos verarbeiten. Das ganze nennt man dann übrigens auch REST-Service ;)

  17. Autor dieses Themas

    adelwoehrer

    Kostenloser Webspace von adelwoehrer

    adelwoehrer hat kostenlosen Webspace.

    Das ist in der Form leider nicht möglich.
    Mein Programm sammelt die Daten, die es übermitteln soll, vom PC.
    Es kann allerdings nicht alle Daten, die der Server zur sofortigen Berechnung bräuchte, auf einmal sammeln, da hierfür einige Bestätigungen des Benutzers erforderlich sind.
    Zusätzlich kommt hinzu, dass ich mangels Rechte am PC des Benutzers keine Schreibrechte habe (nichtmal im Programmordner selbst)....es ist mir also nicht möglich, die Daten erstmal zu sammeln und später gemeinsam abzuschicken, weil ich sie in der Zwischenzeit lokal nirgends abspeichern könnte.

    Das Program schickt also alle Daten, die es bekommt, umgehend an den Server....der Server seinerseits überprüft dann wiederrum, ob er vom Client PC bereits alle Daten hat, um dem Programm das berechnete Ergebnis zurückgeben zu können.
    Bis der Server alle Daten hat, kann es bis zu 15 Minuten dauern....deshalb liegen die Daten in der Zeit am Server....und da am besten halt in einer Datenbank.

    Ich habe natürlich auch Angeboten, die Daten erstmal im Programm als Array zu sammeln....ist vom Kunden aber nicht gewollt.
    Warum, weiß ich nicht....das lässt er sich nicht ausreden....ich muss nunmal programmieren, was der Kunde will.
    Von seiner Seite hieß es nur: "Möglichst sicher, und die Daten sofort übermitteln."

    Beitrag zuletzt geändert: 17.5.2012 19:31:47 von adelwoehrer
  18. s******i

    Hmm. Jetzt verstehe ich das Dilemma :) Alternativ könntest du auch die Daten im Ram-Speicher Ablagern. Ich kann dir nur zu Stateless Services raten, mit anderen Lösungen du wenig Spaß haben.
    Aber natürlich geht das auch mit der Datenbank.

    EDIT: War zu langsam. Am Ende ist der Kunde doch der König, auch wenn er noch so ***** ist.

    Beitrag zuletzt geändert: 17.5.2012 19:37:58 von spuglisi
  19. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    spuglisi schrieb:
    Ich kann dir nur zu Stateless Services raten, mit anderen Lösungen du wenig Spaß haben[/i].
    du noch ein bisschen üben musst... :biggrin:

    Du könntest uns noch verraten warum man mit Stateful-Services wenig Spaß haben sollte.
  20. s******i

    hackyourlife schrieb:
    spuglisi schrieb:
    Ich kann dir nur zu Stateless Services raten, mit anderen Lösungen du wenig Spaß haben[/i].
    du noch ein bisschen üben musst... :biggrin:

    Du könntest uns noch verraten warum man mit Stateful-Services wenig Spaß haben sollte.


    Hehe, ja, dieser Fehler ist mir beim umformulieren passiert ;)

    Bei Stateless-Services hast du nun mal nicht die ganze Grütze mit der mit der Datenbank. Außerdem sind diese Services lange nicht so fehleranfällig wie Stateful-Services und dazu noch leichter zu warten.


    Beitrag zuletzt geändert: 17.5.2012 20:07:04 von spuglisi
  21. r***********n

    Mach einfach nen (Client-)Server der die MySQL Querys für den Client (In diesem falle dein Programm) ausführen soll und das Ergebnis an den Client schickt.

    Beitrag zuletzt geändert: 18.5.2012 12:28:35 von rene-herrmann
  22. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!