Eine Verbindung zur einer MySQL Datenbank sicher herstellen?



  • @Lucius
    Wenn du es unbedingt mit C++ machen willst, wieso dann nicht mit WinRT bzw. dem App SDK?
    https://learn.microsoft.com/en-us/windows/uwp/cpp-and-winrt-apis/intro-to-using-cpp-with-winrt
    https://learn.microsoft.com/en-us/windows/apps/windows-app-sdk/

    ps: Direkt von der Client-Anwendung auf den Datenbank-Server zugreifen solltest du trotzdem nicht. Warum hab ich ja schon beschrieben. Auch wenn du es hartnäckig ignorierst.



  • Ist denn das mit dem WinRT auch richtiges C++ und nicht wieder so ein MS ding?
    Ich glaube ich weiß was das ist. Ist das nicht die GUI die man nur in Verbindung des MS Stores nutzen kann, also keine exe datei?



  • @Lucius sagte in Eine Verbindung zur einer MySQL Datenbank sicher herstellen?:

    Ist denn das mit dem WinRT auch richtiges C++ und nicht wieder so ein MS ding?

    Das ist richtiges C++. Natürlich ist es auch ein MS Ding. Das ganze SDK kommt ja von MS.

    Ich glaube ich weiß was das ist. Ist das nicht die GUI die man nur in Verbindung des MS Stores nutzen kann, also keine exe datei?

    Mit WinRT/WinUI 2 bist du zwar auf UWP eingeschränkt, aber die App kann man auch ohne MS Store ausliefern/installieren. Mit den nötigen Einträgen im Manifest + Hakerl vom User in den Windows-Settings kann die App dann auch aus ihrer Sandbox "ausbrechen", also z.B. auf beliebige Files zugreifen.

    Mit App SDK/WinUI 3 kannst du ne ganz normale C++ Desktop-Anwendung machen. Läuft halt nur ab Windows 10 Version so-und-so.



  • Ja das ist auch eine Möglichkeit. Ich bin derzeit aber an Boost Lib dran, verstehe es zwar noch nicht wirklich aber gebe mir mühe das zu verstehen.



  • UPDATE Boost:
    Eine TCP Verbindung (also ein HTTP-Package) konnte ich jetzt aufbauen bzw. Senden, die frage ist nur, wie kann ich mir das bezüglich PHP bzw. Datenbank zu nutze machen? Wie frage ich darüber zum Beispiel in der DB einen User ab?

    Ich verstehe eins noch nicht, ich bekomme ein Moved Permanently? Warum passiert das?

    std::stringstream getRequest;
    		getRequest << "GET / HTTP/1.1\r\n";
    		getRequest << "Host: stackoverflow.com\r\n";
    		getRequest << "Connection: keep-alive\r\n";
    		getRequest << "user-agent: Mozilla / 5.0 (Windows NT 10.0; Win64; x64) AppleWebKit / 537.36 (KHTML, like Gecko) Chrome / 107.0.0.0 Safari / 537.36";
    		getRequest << "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\r\n";
    		getRequest << "Accept-Language: de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4\r\n";
    		getRequest << "\r\n";
    		boost::asio::write(tcpSocket, boost::asio::buffer(getRequest.str()));
    		tcpSocket.async_read_some(boost::asio::buffer(data), readHandler);
    

  • Mod

    Du musst das halt programmieren, das war dir klar, oder? Also auf deinem Server einen Endpoint, der irgendwas gegenüber der Datenbank macht, und das Ergebnis zurück gibt. Den Endpoint fordert dein Client dann an und wartet (und erhält hoffentlich) diese Antwort. So etwas kann üblicherweise auch Parameter haben, die auf diverse Art und Weise in der URL codiert sein können.

    So wie es auf dem Server www.c-plusplus.net einen Endpoint /forum/topic gibt, der dann noch zusätzliche Parameter wie '353675', 'eine-verbindung-zur-einer-mysql-datenbank-sicher-herstellen', und '53' nimmt. Der dann, wenn ein Request auf https://www.c-plusplus.net/forum/topic/353675/eine-verbindung-zur-einer-mysql-datenbank-sicher-herstellen/53 kommt, aus einer Datenbank den Thread 353675 (eine-verbindung-zur-einer-mysql-datenbank-sicher-herstellen) abruft, eine Webseite erstellt, die zum 53 Beitrag springt, und das dann zurück liefert. Dabei können dann auch Zugangsberechtigungen für den eingeloggten Nutzer geprüft werden, ob der das überhaupt angucken darf, denn der ganze Zweck der Übung war ja schließlich, dass eben nicht jeder Hansel effektiven Vollzugriff auf alle Daten erhalten soll.

    Da hast du die volle Freiheit, zu programmieren was auch immer du möchtest, und zurück zu geben was auch immer du willst, braucht nicht einmal eine Webseite zu sein. Ich spreche zwar kein PHP, aber ich nehme mal an als eine auf diese Funktionalität spezialisierte Sprache kann es nicht all zu schwer darin sein, Endpunkte zu definieren, die irgendwelche Parameter haben können, die dann irgendwas machen (meistens halt gegen eine Datenbank), und dann zurück zu geben was man will.

    PS: Ich weiß nicht genau, wie c-plusplus.net intern programmiert ist, und ob der Endpoint wirklich an der genannten Stelle sitzt, und wie der genau arbeitet. Aber so könnte es funktionieren.



  • Nabend, ja natürlich ist mir das klar. Allerdings bin ich eher jemand der an Hand von Beispielen Lernt.
    Ich habe wie oben beschrieben, schon eine GET anfrage gestellt. Bei mir ist es komischerweise so, das Moved Permanently kommt statt 200 OK obwohl alles richtig ist.

    Allerdings ist das nicht mein Größtes Problem:
    Ich verstehe dieses Boost.Asio nicht, ich finde das die Doku sehr dürftig in meinen Augen ist, zu mindestens komme ich mit der Doku auf Boost nicht zurecht.

    Ich weiß, das man die GET / HTTP in POST datei.php HTTP umstellen kann, nur mir erschließt nicht, wie man dann die PHP datei gestalten soll, zusätzlich muss doch auch eine Rückmeldung kommen, sonst weiß man ja nicht was da passiert ist. Momentan stecke ich total fest. Ein Beispiel im Internet, das ein HTTP Post mit einer PHP Datei zeigt finde ich nicht...



  • @Lucius sagte in Eine Verbindung zur einer MySQL Datenbank sicher herstellen?:

    @Cardiac sagte in Eine Verbindung zur einer MySQL Datenbank sicher herstellen?:

    security through obscurity

    Wenn du meine Beiträge gelesen hättest, dann würdest du direkt verstehen, das mir es nicht um die Sicherheit beim Verschleiern geht,
    das habe sehr häufig geschrieben.

    Ich habe jetzt nochmal alles richtig durchgelesen, nachdem ich das erste mal nur alles ueberflogen habe, und kann keine stelle finden and der du explizit verhindern willst, dass jemand deinen code klaut. Der einzige hinweis bzgl. obfuscation war der gedanke access credits direkt in dein binary zu legen, sonst nichts.

    Dein moved permanently ruehrt daher, dass SO deinen http requests auf TLS upgraded.

    Ausserdem wuerde ich zu beast raten, wenn es - wenn auch aus den falschen gruenden - unbedingt C++ sein muss.



  • @Lucius Wo hast du den Request hingeschickt? Auf stackoverflow.com port 80 oder mit HTTPS auf stackoverflow.com port 443? Auf Port 80 wirst du einen Redirect (301 Moved Permanently) auf HTTPS port 443 bekommen. Das ist zu erwarten.

    Wenn dir Windows reicht musst du den Code aber auch nicht mit C++/ASIO selbst schreiben. Windows hat da fertige Funktionen, siehe z.B. https://learn.microsoft.com/en-us/windows/win32/api/winhttp/nf-winhttp-winhttpsendrequest
    Das spart einiges an Aufwand, weil du dich nicht mehr um Dinge wie TLS oder Redirects kümmern musst und Sachen wie Authentifizierung sind auch trivial (WinHttpSetCredentials aufrufen -> done). Mit Boost.ASIO ist das alles wesentlich komplizierter. Eine plattformübergreifende Library wäre libcurl. Ist halt C-ohne-++ und uralt und hat eine ziemlich eigene und gewöhnungsbedürftige und mMn. grässliche API. In den meisten Programmen ist das aber nicht schlimm, weil man libcurl nicht an vielen Stellen braucht. Eine kleine Hilfsklasse die die Verbindung zu einem HTTP(S) Server representiert und eine "get" sowie eine "post" Funktion zur Verfügung stellt ist schnell geschrieben, und im restlichen Programm arbeitet man dann bloss noch mit der. (Empfiehlt sich natürlich auch wenn man mit WinHttp arbeitet. Das hat zwar ein halbwegs schönes Interface, aber direkt im Programm an allen Stellen wo man HTTP Requests macht verwenden will man das auch nicht.)

    Was die Kommunikation mit nem PHP Skript angeht...

    Typischerweise macht man das über REST Schnittstellen - wobei das REST Konzept da oft recht frei interpretiert wird.

    Wenn du nur Daten lesen willst, dann schick einen GET Request wo du z.B. in den Query-Parameter mitschickst was du lesen willst. Das PHP Skript schaut sich dann den Query-String an, und schickt die passenden Daten zurück. Bzw. evtl. einen Fehler - der dann mit HTTP Status 4xx zurückgeschickt wird.
    Die Antwort-Daten werden oft als JSON geschickt.

    Wenn es nicht um reines Lesen geht, also am Server evtl. irgendwelche Daten geändert werden durch den Request, verwendet man meist POST. Da kann deine Anwendung dann auch einen Request-Body mitschicken. Du kannst aber auch weiterhin Daten im Query-String mitschicken. Und der Server kann weiterhin Daten zurückschicken wie bei GET.

    Setz zum Testen einfach mal einen lokalen HTTP Server auf. Ne einfache ASP .NET MVC Seite oder mit PHP oder mit was du dich halt auskennst. Und dann probier es aus.



  • Hey vielen dank, das ist eine Weitere Möglichkeit auf meiner Liste.
    Das mit Boost ist ja so ne Sache: Natürlich habe ich in diesem fall Port 80 verwendet. Im nachhinein ist mir das auch aufgefallen. Hatte dann den Versuch gestartet, den Port 443 zu nehmen, leider ergab das ein 400 Bad Request, warum auch immer 🙃

    Dann habe ich auf der Liste mit curl angefangen:

    std::string result;
    	CURL* curl;
    	CURLcode res;
    	curl_global_init(CURL_GLOBAL_DEFAULT);
    	curl = curl_easy_init();
    	if (curl) {
    		curl_easy_setopt(curl, CURLOPT_URL, "https://www.domain.de/index.html");
    		curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_write);
    		curl_easy_setopt(curl, CURLOPT_WRITEDATA, &result);
    		curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);
    		res = curl_easy_perform(curl);
    		curl_easy_cleanup(curl);
    		if (CURLE_OK != res) {
    			std::cerr << "CURL error: " << res << '\n';
    		}
    	}
    	curl_global_cleanup();
    	std::cout << result << "\n\n";
    

    Und Hey, was soll ich sagen, ich bekomme immerhin ein 200er OK raus, html wird ausgelesen und angezeigt.
    Nur wie mir das bei meinem Login über C++ auf php Datei helfen soll, weiß ich noch nicht. Und seid mir nicht Böse, aber die Dokumentationen sind an manchen stellen so schwammig geschrieben, das ich für die sogar ein Spezielles Studium brauche 😆

    Ich habe Zwei Probleme:
    Die Sprache ist nicht das Problem sondern die Tatsache,
    das die Grundlagen keines dieser Themen abdeckt, Gute Bücher nur im Englischen gibt, und es in jeder Sprache gleich beigebracht wird. Was sind Strings, was sind Arrays, der ganze kram halt.

    Im Englischen Bereich bekommt man noch etwas mehr Infos. Ich bin allerdings kein English-Muttersprachler, ich verstehe dieses Problem schon in Deutsch nicht, wie soll ich das dann im Englischen verstehen. Ich mag die Sprache C++ wirklich, nur die Dokus darüber sind meiner Meinung echt Mager, natürlich hat jeder von uns bestimmt anfänglich Probleme gehabt. Ich bin froh das ich hier Nette Menschen gefunden hab, die mir echt versuchen zu Helfen.

    Wenn ich dieses Forum nicht gehabt hätte, dann würde wahrscheinlich jetzt, eine Ecke aus meiner Schreibtischplatte fehlen 😂



  • Erstmal Glückwunsch für deinen ersten erfolgreichen HTTP Request mit curl.

    @Lucius sagte in Eine Verbindung zur einer MySQL Datenbank sicher herstellen?:

    Die Sprache ist nicht das Problem sondern die Tatsache,
    das die Grundlagen keines dieser Themen abdeckt, Gute Bücher nur im Englischen gibt, und es in jeder Sprache gleich beigebracht wird. Was sind Strings, was sind Arrays, der ganze kram halt.

    Das Problem ist halt, das Netzwerk Kram nicht geeignet für Programmiergrundlagen ist. Du hantierst jeweils mit verschiedenen Protokollen, die du je nach dem kennen / können musst. Du kommunizierst mit einer anderen Instanz, die musst du aufsetzen und laufen haben. Außerdem müssen Grundlagen wie Datenstrukturen und Kontrollstrukturen schon vorhanden sein.

    Und, C++ ist für so was, gerade wenn es auch um ein schnelles Erfolgserlebnis geht, erstmal undankbar, da es keine Bordmittel mitbringt, die das für dich abstrahieren. Daher bist du dann auf Libraries angewiesen, die das für dich übernehmen oder musst alles selbst machen.

    Bei dir habe ich gerade das Gefühl, dass es nicht nur an C++ liegt, sondern auch das Verständnis fehlt, wie HTTP funktioniert.

    Du kannst z.B. mit curl einen http post request an deine php Seite schicken. Die php Seite meldet sich an der mySQL Datenbank an und macht die Abfrage, die du über den Post spezifiziert hast. Anschließend gibt die php Seite dann das Ergebnis zurück.

    Das alles hat aber weniger mit C++ zu tun, sondern erstmal mit php und mySql. Wenn das steht, ist es egal ob der http Request aus einem in C++ geschriebenen Clienten kommt, ob via curl direkt aus der Kommandozeile, oder über einen beliebigen Client der http post requests schicken kann. (Ich habe dafür z.B. ein VS Code Plugin).

    Edit: Du kannst natürlich auch einen C++ Webserver schreiben, der auf der anderen Seite deine Anfragen entgegennimmt und der dann mit der Datenbank kommuniziert. Aber, dass macht es natürlich nicht einfacher.



  • @Schlangenmensch Ja da gebe ich dir Recht. HTTP ist nicht wirklich meine Stärke. Ich weiß wie man diese ohne Probleme in PHP Manipuliert oder für sich so nutzt, das es richtig gute Vorteile bringt. aber im allgemeinen fehlt mir das erweiterte Verständnis. Ich finde aber auch keine Wirklichen guten Bücher darüber oder Tutorials die, Zeigen wie man das ganze verstehen muss.

    Das Problem ist auch nicht das Verständnis, eher die Übersicht und die Anwendungsmöglichkeit die so eine lib bietet.
    Woher soll man denn wissen, wie ich so eine Lib anwenden kann.

    Bevor ich wieder nach Goldenen Karnischen suche, ist das die richtige Doku:
    https://curl.se/docs/manual.html

    Unter den Abschnitt HTTP und dann unter POST (HTTP) sollte doch genau das sein, was ich brauche oder?
    Ich frage deshalb, weil es unter C++ sehr oft vorkommt, das Funktionen so benannt sind, wo man denken könnte, das man weiß wofür diese Funktion steht, aber wenn man dann nachliest, genau das Gegenteil der fall wahr.



  • @Lucius Das ist die Doku zu dem curl commandline tool. Du suchst die Doku zu libcurl: https://curl.se/libcurl/c/

    Vielleicht hilft dir auch das weiter: https://everything.curl.dev/libcurl-http

    @Lucius sagte in Eine Verbindung zur einer MySQL Datenbank sicher herstellen?:

    Ich frage deshalb, weil es unter C++ sehr oft vorkommt, das Funktionen so benannt sind, wo man denken könnte, das man weiß wofür diese Funktion steht, aber wenn man dann nachliest, genau das Gegenteil der fall wahr.

    Das wäre mir so noch nicht untergekommen. Aber Dokus können, insbesondere für Anfänger, schwer zu lesen sein.

    Wenn ich mit C++ die Auswahl hätte, würde ich mal hier: http://www.curlpp.org/ gucken, auf den ersten Blick finde ich den C++ Wrapper schöner, als das C-Interface.


  • Mod

    Du bist wahrscheinlich der erste, der bei den Namen der C++-Funktionen intuitiv zu verstehen meint, was sie machen .partial_sort_copy, ist doch klar! Andererseits bist du auch der wohl erste, der meint, C++ wäre schlecht dokumentiert. Mach bloß niemals eine andere Sprache, wenn dir die zahlreichen und vollumfänglichen C++-Referenzen nicht reichen…

    Zurück zum Thema: Ich habe den Eindruck, dass hier mächtig aneinander vorbei geredet wird, möglicherweise wegen mangelndem Begriffsverständnis. Was hast du denn und wo genau hast du Schwierigkeiten?

    • Hättest du einen Server, bei dem man so etwas wie dein_server/irgendwas anfordern könnte, und dann einen Text deiner Wahl, z.B. 123 zurück bekommt?
      • Diesen Server kannst du beispielsweise in deinem Browser, oder mit Curl auf der Kommandozeile ansprechen, und bekommst dann auch tatsächlich 123 angezeigt?
      • Könntest du statt 123 auch das Ergebnis einer Datenbankabfrage zurück geben? Falls Nein, warum nicht? Falls ja, funktioniert das auch im Browser oder mit Curl?
      • Könntest du auch weitere Parameter des GET-Requests verarbeiten bei solchen Anfragen? Falls Nein, warum nicht? Falls ja, funktioniert das auch im Browser oder mit Curl?
      • Könntest du statt GET-Requests auch POST-Requests verarbeiten? Falls Nein, warum nicht? Falls ja, funktioniert das auch mit Curl? (Im Browser geht POST etwas schwieriger, daher frage ich nicht)
    • Hast du Clientcode, der einen GET-Request an eine Adresse deiner Wahl schicken kann?
      • Dieser Client kann erfolgreich http://www.example.com abrufen und du bekommst dann auch den Quelltext eben jener Seite?
      • Dieser Client kann erfolgreich https://www.example.com (also verschlüsselt) abrufen und du bekommst dann auch den (entschlüsselten) Quelltext eben jener Seite? Falls Nein, warum nicht?
      • Hindert dich irgendetwas, diesen Client gegen deinen Server Abfragen machen zu lassen?
      • Fehlt dir etwas anderes, z.B. POST Requests? Wenn ja, was und warum?


  • Es ist vollbracht 😀 Ich habe es vollbracht, eine anfrage über Curl an einer php datei zu machen, die mir dann die Rückmeldung gibt, ob ein String übergeben wurden. Jetzt stellt sich die Frage, wie ich mehrere Strings abfragen und diese statt statisch eher in einer Variable legen kann?

    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=MeinString");
    

    string variable= "MeinString";
    string variable2= "MeinString2";

    Also mein MeinString soll über "name=$variable AND $variable2" übergeben werden.

    Das $ soll nur die Variable kennzeichnen, hat natürlich nichts mit C++ zu tun.

    @SeppJ Da hast du mich aber missverstanden. Ich habe nicht gemeint, das C++ Schlecht Dokumentiert ist, sondern eher Mager. Aber eigentlich war dies eher auf die einzelnen Libs bezogen.



  • Bei CURLOPT_POSTFIELDS musst du Daten im Format application/x-www-form-urlencoded reinschreiben. Also im Format param1=value1&param2=value2&param3=value3. Parameternamen und Werte müssen dabei URL-encoded werden, also mit den lustigen %20 für Leerzeichen etc. URL-encoden kannst du z.B. mit curl_easy_escape. Oder du schreibst es dir selbst, ist nicht so schwer.

    Oder kurz gesagt: so wie auch der "query" Teil einer URL aufgebaut ist, bloss ohne ? am Anfang.

    Wenn du so Binärdaten übertragen willst, empfielt es sich diese Base64 oder hex zu kodieren. Das musst du auf der Empfängerseite dann manuell rückgängig machen - PHP weiss ja nicht dass der String der da kommt Base64/hex-kodiert ist. Wobei bei Base64 zu beachten ist dass der Output Zeichen enthalten kann die URL-encoded werden müssen. Also erst Base64-encoden und den Output davon dann nochmal URL-encoden. Bei hex ist das nicht nötig.



  • @Lucius sagte in Eine Verbindung zur einer MySQL Datenbank sicher herstellen?:

    Bevor ich wieder nach Goldenen Karnischen suche, ist das die richtige Doku:
    https://curl.se/docs/manual.html

    Fast. Die Doku für lib curl findest du hier: https://curl.se/libcurl/ bzw. https://curl.se/libcurl/c/



  • @Lucius Nochwas: ich kann dir nur raten dein Englisch zu verbessern. Wie du selbst schon festgestellt hast, findet man kaum deutsche Doku und auch ansonsten nur wenig wirklich gute Infos. Wäre mMn. auch verschwendete Zeit sowas zu produzieren. Also Doku in zig verschiedene Sprachen zu übersetzen. Und Englisch ist sowieso praktisch wenn man es gut kann, ist ja quasi fast das ganze Internet in Englisch.

    Persönlich hab' ich erst gut Englisch gelernt als ich angefangen habe Filme/Serien auf Englisch zu schauen - und dann etwas später Bücher (belletristik) auf Englisch zu lesen. Und Doku auf Englisch lesen hilft natürlich auch - je mehr du das machst, desto leichter fällt es. Am Anfang muss man noch öfter mal Wörter nachschlagen, aber das wird schnell besser.



  • @hustbaer Da gebe ich dir recht, mein Englisch kann wirklich besser werden. Werde ich zu Herzen nehmen, da mich das selbst stört.

    Wenn ich dich richtig verstanden habe, müsste das dann so aussehen:

    char* encoded = curl_easy_escape(curl, "name=test", 0);;
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, encoded);
    

    Oder habe ich dich missverstanden? Also das mit der Variable 1 und 2 habe ich nicht wirklich verstanden.

    Das CURLOPT_POSTFIELDS wollte ich eigentlich in mehreren eingaben unterteilen, so das dies aus einer Variable statt statisch mit name=blabla steht.

    Da ich ja wesentlich mehr als nur ein String bei der PHP anfragen müsste, muss ich die CURLOPT_POSTFIELDS einer Variable versehen, damit diese auch wachsen kann. In den Dokus habe ich dies bezüglich nichts gefunden. Base64 ist auf meiner Liste 😀

    Ist das Normal, das ich in Wireshark keinerlei Bewegung unter http feststelle?



  • Ich frage nochmal: Warum machst du dir das leben so schwer und verwendest curl direkt (oder boost oder irgendeine andere relativ low level library?)

    Nutze https://github.com/libcpr/cpr oder irgendeine andere besser abstrahierte Library.

    Evtl. solltest du dir sogar überlegen erstmal gar keinen Client zu schreiben. Schreib doch erstmal deinen Server und teste ihnen mit einem HTTP Tool deiner Wahl (z.B. https://www.advancedrestclient.com/, https://www.postman.com/).


Anmelden zum Antworten