Eine Verbindung zur einer MySQL Datenbank sicher herstellen?



  • Du kannst Qt auch kommerziell nutzen ohne deinen Code zu veröffentlichen und ohne dafür zu bezahlen.



  • Danke an euch beiden.



  • @Lucius hier, les mal meinen ersten Beitrag. Da steht alles: https://www.c-plusplus.net/forum/topic/350970/qt-kommerziell-nutzen
    Hinzu kommt glaube noch, dass du Qt inklusive Copyright irgendwo nennen musst. Vielleicht in einem "About" Fenster oder so



  • @Zhavok Ja das habe ich auch überall gelesen. Das Problem für mich ist die Abhängigkeit, QT nutzt ja auch die WinAPI wenn ich mich nicht täusche? Dann frage ich mich doch, ob das nicht besser wäre die WinAPI richtig zu verstehen, damit man selbst seine Form ohne QT aufbauen kann.

    Am Anfang ist das natürlich Arbeit, aber wenn man einmal eine Form richtig angepasst hat und diese als Vorlage nimmt, spart man auch sehr viel Zeit, zwar nicht so viel wie in QT, aber man hat die Abhängigkeit / Lizenzen nicht mehr.

    Klar unter Linux oder Mac müsste man das ganze auch machen, aber ich selbst werde erstmal nur in Windows proggen.



  • Willst du erst viel lernen (und ausprobieren) müssen oder möchtest du in kurzer Zeit eine Applikation entwickeln?



  • Qt ist Multiplatform, hat ne super Doku, allerhand Features für allemöglichen Probleme und ich persönlich finde das Design der Lib ganz gut. Du kannst sogar damit mobile Anwendungen basteln. Auf die WinAPI zu setzen kann ich dir absolut nicht empfehlen. Du kannst dadurch effektiv nichts besser als wenn du ne Lib verwendest. Klar, du machst dich damit abhängig von der Qt, aber wenn du irgendwann deine Software auf Linux oder MacOS veröffentlichten willst kannst du auch direkt von vorn anfangen. Und wenn du Qt nicht magst dann nimm was anderes. ImGui soll auch ganz gut sein.



  • @Th69 Naja, viel lernen muss ich sowieso. Ich finde wenn man eine Sache lernt, dann sollte man Sie schon richtig lernen. Ich war noch nie ein Freund von Frameworks. In PHP hat man ja auch sehr viele Möglichkeiten und ja, man muss das Rad nicht neu erfinden, allerdings sollte man wissen, wie das Rad gebaut wurde.

    Die Vergangenheit hat auch gezeigt, das einige Frameworks bereits gestorben sind. Ich bin ja auch nicht unter Zeitdruck. Achja und ich baue die WinAPI Form bis hin zu den Steuerelemente in Ca. 1 Stunde auf. Klar muss da noch das Design angepasst werden und das hält zwar auf, aber mit der Zeit wird man immer Schneller. Ist auch kein Hexenwerk ☺

    @Zhavok Na klar, hast ja nicht unrecht. Es kann auch sein das ich ein anderes Framework nutze statt WinAPI, imGUI oder wxwidgets, welches davon besser ist, keine Ahnung. Wenn ich an meinen Grenzen mit der WinAPI komme, dann muss ich mir ja sowieso was anderes überlegen 🙂

    Aber jetzt stehen erstmal die ganzen Tipps hier Vordergrund. Muss die Sowieso in der Console testen.



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

    Naja, viel lernen muss ich sowieso. Ich finde wenn man eine Sache lernt, dann sollte man Sie schon richtig lernen. Ich war noch nie ein Freund von Frameworks. In PHP hat man ja auch sehr viele Möglichkeiten und ja, man muss das Rad nicht neu erfinden, allerdings sollte man wissen, wie das Rad gebaut wurde.

    Zum üben und lernen kann man einiges machen. Allerdings wird man so selten fertig und nicht in einer konkurrenzfähigen Qualität.

    Am Ende ist auch dabei die Frage, wie weit man das durchexerzieren will. Ist die stl in Ordnung? Ist die WinApi in Ordnung? Auch das sind Bibliotheken.

    Aber am Ende ist es dein Spaß 😉



  • @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.


Anmelden zum Antworten