Laden...

Kein externes Zugriff auf die MySQL-Datenbank bei IONOS

Erstellt von LittleTester vor 2 Jahren Letzter Beitrag vor 2 Jahren 2.983 Views
L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor 2 Jahren
Kein externes Zugriff auf die MySQL-Datenbank bei IONOS

Verwendetes Datenbanksystem: MySQL 5.7 beim Provider IONOS

Ich habe mir in mühevoller Kleinarbeit ein Inventarisierungsprogramm in C# geschrieben, dass jetzt fast fertig ist. Nun wollte ich die ersten Daten in unsere MySQL-Datenbank speichern und eine Verbindung aufbauen. Schon das funktioniert nicht. Aus Sicherheitsgründen lässt IONOS keine externen Programme zu, sondern nur direkt über den Webspace.

Auf dem Webspace läuft schon die Webseite, wo ich die Daten aus der Datenbank abfragen und anzeigen kann.

Tja, jetzt stehe ich ziemlich doof da, weil die ganze Arbeit scheinbar völlig umsonst war 🙁 Weiß vielleicht jemand was ich nun machen kann? Klar, mein Arbeitgeber könnte einen Root-Server mieten, aber ist das nicht etwas weit ausgeholt? Außerdem bin ich eher Hobbyprogrammierer und Scripter (deswegen auch die mühevolle Kleinarbeit) und würde von daher nicht behaupten, dass meine Scripte und Anwendungen absolut sicher sind. Ich schätze mal die Angriffsmöglichkeiten sind außerhalb der IONOS Bubble deutlich größer und ein starkes Passwort alleine wird mich nicht schützen wenn ich einen Root-Server miete.

Vielleicht kann jemand von euch das Projekt noch retten und hat eine Idee, was machbar ist.

Edit: Noch eine Ergänzung: Das Programm soll bei jedem Systemstart ausgeführt werden und aktuelle Inventardaten in die Datenbank eintragen. Wir haben mehrere Startorte und auch Mobile Arbeitsplätze. Einfach einen Server ins Intranet stellen ist also keine Möglichkeit.

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6

16.806 Beiträge seit 2008
vor 2 Jahren

Aus Sicherheitsgründen lässt IONOS keine externen Programme zu, sondern nur direkt über den Webspace.

wird mich nicht schützen wenn ich einen Root-Server miete.

Und das ist auch gut so und der absolute Sicherheitsstandard von Hosting- oder Cloud-Anbietern. Datenbanken sollten nie aus dem Internet erreichbar sein.
Je nachdem was ihr inhaltlich speichert (und Inventar könnte dazu gehören) dürft ihr das auch gesetzlich nicht -> GDPR.

Tja, jetzt stehe ich ziemlich doof da, weil die ganze Arbeit scheinbar völlig umsonst war

Ja, das kommt, wenn man vorher nicht plant. Hast nun also wenigstens was dazu gelernt. 🙂
Du hast viel Zeit in den Sand gesetzt, weil Du schon den grundlegenden Fehler gemacht hast, dass Deine Anwendung Remote mit einer Datenbank kommuniziert.
Schlimmer kann man direkt gesagt die Sache nicht angehen.

Deine Anwendung sollte mit einem zB HTTP Endpunkt sprechen, also einem Webservice.
Dieser hat dann internen / lokalen Zugriff auf die Datenbank.

In der .NET Welt gibts dazu ASP.NET mit einem Json Endpunkt.
Tutorial: Erstellen einer Web-API mit ASP.NET Core

L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor 2 Jahren

Danke für deine Antwort, auch wenn es natürlich nicht das ist, was ich lesen wollte 😄.

Ich habe noch einige Fragen, weil ich mich jetzt zwangsweise angefangen habe mit der Thematik zu befassen und verzweifelt irgend eine Lösung suche.

  1. Es gibt Anbieter im Internet, die Remote-Zugriff auf die Datenbank erlauben. Beispielsweise Cloudways oder Fritz Managed IT GmbH Ist das per se unseriös?

  2. Ich weis nicht, ob es einen Unterschied macht, aber im Grunde müssen zwar die Daten die die Anwendung sammelt irgendwie in die Datenbank gelangen, aber zum Abrufen der Daten würde es reichen, wenn das nur von einer einzigen IP aus möglich ist. Wir haben eine feste IP. Das Eintragen von Daten könnte man auf IPs aus der Region Baden-Württemberg beschränken. Woanders sind unsere Leute, auch jene mit Laptops, nicht. (wenn es da solche Filter gibt (Cloudways schreibt hier was davon, aber nur für SSH und SFPT, müsste man also erfragen, ob das auch für die Datenbank möglich ist).

  3. Es wäre kein Problem für mich den Webserver im eigenen Netzwerk der Geschäftsstelle verfügbar zu machen. Dort will ich die Daten ja abrufen. Einen OpenVPN-Server gibt es, eine feste IP haben wir auch. Ich konnte aber kein Ergebnis finden, wo es möglich ist, dass man eine C#-Anwendung so programmieren kann, dass diese eine VPN-Verbindung aufbaut und auch nur diese Anwendung dann das VPN nutzt. Über Nu-Get findet sich dahingehend auch kein Paket. Geht also nicht?

  4. In einem YouTube-Video wird gezeigt, wie man mittels SSH auf einen MySQL-Server zugreift. Mit SSH kenne ich mich aber nicht aus. Ich kenne das nur als Zugriffsmöglichkeit bei einigen IoT-Geräten. Wenn man SSH aber direkt beim Router zum MySQL-Server durchschleift hat das doch ohnehin den gleichen Effekt, als wenn ich den Server direkt offen ins Netz stelle. SSH ist ja nur ein anderes Protokoll. Also völlig schwachsinnig?

  5. Warum ist ein Datenbankserver im Internet unsicherer als ein SFTP-, Web- oder Mailserver? Was ist der Unterschied?

  6. Gibt es Möglichkeiten eine Datenbank, die man remote zugänglich machen will vernünftig abzusichern, beispielsweise in dem man einen Key in seine Anwendung einbaut der (neben Benutzername und Passwort natürlich) zur Authentifizierung abgefragt wird und das ein Zugriff nur zu bestimmten Uhrzeiten möglich ist, oder der Hashwert der anwendung geprüft wird, etc.

Das verlinkte Tutorial habe ich leider absolut nicht kapiert. Ich danke euch schonmal.

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6

16.806 Beiträge seit 2008
vor 2 Jahren

Ist das per se unseriös?

Das Angebot selbst ist nicht unseriös, aber Deine Umsetzung wäre es.
Es ist einfach Sicherheitsregel N° 1: Datenbank aus dem Internet nicht erreichbar. Punkt.

ob das auch für die Datenbank möglich ist

Das wäre ein Firewall Features des Datenbankangebots. Auf den Cloud-Plattformen ist sowas möglich.

C#-Anwendung so programmieren kann, dass diese eine VPN-Verbindung aufbaut

Weil so VPN nicht funktioniert. Du brauchst einen VPN Client (oder Du benutzt direkt das Betriebssystem).

Also völlig schwachsinnig?

Zumindest Deine Suche nach einer Murkslösung ist schwachsinnig, um Dein Wort zu verwenden.
Warum sträubst Du Dich so einzusehen, dass Deine aktuelle Lösung halt ein Holzweg ist; und wieso machst es nicht so, "wie man es tun sollte", nachdem Du nun die entsprechende Hinweise und evtl. Erkenntnisse hast?

Hast planlos drauf losgelegt und war halt nich so gut. Passiert 🙂
Draus lernen und richtig machen, fertig.

SSH selbst ist halt die Verschlüsselung der Verbindung.
Hilft Dir aber prinzipiell nicht dabei, dass man Datenbankserver an für sich nicht - wenn man nicht muss - aus dem Internet erreichbar macht.
Gibt ja noch mehr potentielle Lücken als nur die DB Verbindung für Queries.

Warum ist ein Datenbankserver im Internet unsicherer als ein SFTP-, Web- oder Mailserver?

Jedes System, das aus dem Internet erreichbar ist, ist damit Angriffen ausgesetzt.
Grundregel IT: so wenig wie möglich angreifbar machen.
Während ein Mailserver bewusst aus dem Internet erreichbar sein muss, und entsprechend so umgesetzt wurde, ist das bei Datenbanken nicht der Fall.
Datenbank-Verbindungen sind vor allem auf Performance ausgelegt, weniger auf 10000%tige Sicherheit.

Und öffentlich erreichbare Datenbanken sind auf Platz 1 für Datenlecks.
Google einfach mal (keine Ahnung, irgendwas wie) "database expose internet bad" und Du wirst hoffentlich danach schlauer aus der Sache gehen.

Gibt es Möglichkeiten eine Datenbank, die man remote zugänglich machen will vernünftig abzusichern, beispielsweise in dem man einen Key in seine Anwendung einbaut der (neben Benutzername und Passwort natürlich) zur Authentifizierung abgefragt wird und das ein Zugriff nur zu bestimmten Uhrzeiten möglich ist, etc.

Alles unnötiger Quark.

Mach es über eine API; hast viel weniger Aufwand.

L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor 2 Jahren

Wieso wäre meine Umsetzung unseriös, wenn das Angebot an sich seriös ist? Schließt sich meiner Meinung nach dann aus.

Das mit der WebAPI habe ich absolut nicht kapiert. Muss ich das zusätzlich in meine Anwendung einbauen? Muss ich meine Anwendung über Board werfen und neu anfangen? Wie greife ich über eine Webanwendung auf WMI und Registry des Systems zu? Was steckt da überhaupt dahinter? Ist es noch WinForms?

Entschuldige bitte, wenn ich etwas nerve. Du hast es mit einer Person zu tun, die über einen sehr niedrigen Wissensstand in der Programmierung verfügt und der auch das so genannte "logische Denken" fehlt. Ich will es können, tue mich aber leider sehr schwer.

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6

T
2.219 Beiträge seit 2008
vor 2 Jahren

Du solltest den Link mal lesen und auch verstehen.
Die Web API läuft als Web Anwendung auf einem Webserver.
Deine lokale Anwendung kommuniziert nur mit der WebAPI und fragt dort die Daten ab.
Die Daten werden dabei ganz normal über http(s) Anfragen vom Client abgeschickt und die Antworten entsprechend zurück gesendet.
Wenn du dich mal mit einem einfachen Testprojekt dran machst, wirst du verstehen wie einfach das klappt.

Warum du Zugriff auf Registry willst, ist mir nicht ganz klar.
I.d.R. braucht man dies nur sehr selten bei einer Webanwendung.
Die WebAPI sollte auch nur zur Kommunikation zwischen Client und Datenbank dienen.
Mehr sollte diese hier erstmal nicht erfüllen, es sei den du hast noch Anforderungen die du über die Api abdecken willst.

Als Format zur Datenübertragung empfiehlt sich dann auch json, da es recht kompakt ist und dies von jedem gängigen Client ohne Probleme gelesen werden kann.
Die Umwandlung kannst du dann mit System.Text.Json machen, was auch ohne großen Aufwand programmiert werden kann.

Nachtrag:
Wenn du eine saubere Architektur hast, kannst du in deiner Anwendung eigentlich ohne großen Aufwand die Kommunikation im Client auf die WebAPI umstellen.
Wenn dies aber nicht der Fall sein sollte, dann schau die den Artikel dazu an.

[Artikel] Drei-Schichten-Architektur

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

16.806 Beiträge seit 2008
vor 2 Jahren

Deine Windows Forms Anwendung bleibt wie sie ist bzw musst nur das Senden der Daten ändern.
Sie kommuniziert nicht direkt mit der Datenbank, sondern mit einer zweiten Anwendung: einem Webservice, über HTTP. Dafür gibts auch einen Format-Standard, der sich REST nennt.
Der Webservice kommuniziert dann mit einer gesicherten Datenbank.

Das nennt sich Client Server Architektur und ist ca. 40 Jahre alt und immer noch aktuell.
Damit vermeidest Du auch den Käse, dass Clients unkontrolliert auf zentrale Datenbanken zugreifen müssen, weil Du das über einen entsprechenden Webservice besser kontrollieren und authentifizieren kannst.
Sicherheitsaspekte bekommst Du HTTPS bzw. durch das Framework geschenkt.

PS: Du tust Dir selbst nen Gefallen und wirst Dir viel Zeit und Ärger sparen, wenn Du bisschen die Begriffe googelst, die Du nicht kennst, wenn Du ein Tutorial nicht verstehst.
Wir kennen schließlich nicht Deinen Wissensstand 😉 Aber um das Lesen wirst Du nicht drum herum kommen.

Die Umwandlung kannst du dann mit System.Text.Json machen, was auch ohne großen Aufwand programmiert werden kann.

Das muss man alles nicht selbst machen, das kann man alles vom Framework / Ökosystem geschenkt bekommen.
Dazu reicht ein Refit Client und eine Standard ASP.NET Core Controller Action und man hat 0,0 mit irgendwelchen Umwandlungen zutun, weil eben alles implizit.
Eine API kann so mit ~20 Zeilen Code umgesetzt werden.

L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor 2 Jahren

OK, Danke.

Das Problem war, dass ich überhaupt nicht wusste, wie es jetzt weitergehen soll. Die Antwort, dass es "nur" um die Übertragung der Daten geht hat mir jetzt geholfen. Jetzt komme ich hoffentlich erstmal weiter. Ich habe hier auch ein Buch (Einstieg in C# mit Visual Studio 2019), aber leider wird das Thema da nicht erklärt. Nur wie man in eine MySQL-Datenbank schreibt die "ohne Hindernisse" zugänglich ist. Es gibt zwar ein Kapitel "9.9 Datenbank im Internet ändern", aber das beinhaltet was ganz anderes. Schade, dass so etwas nicht erklärt wird. Das Stichwortverzeichnis gibt auch nichts her, wenn nach Rest API oder Web API sucht.

Ich lese also schon auch selbst und lasse mir nicht alles vorkauen. Es ist mir wichtig hier nicht den falschen Eindruck zu vermitteln, wenn ich blöde oder scheinbar ganz offensichtliche Fragen stelle.

Edit: Kann es sein, dass das Thema selbst in diesem umfassenden Handbuch nicht behandelt wird oder suche ich im Inhaltsverzeichnis nach etwas, das dort anders bezeichnet ist?

Kennt jemand Linkedin Learning und weiß zufällig, ob dort das Thema anschaulich erklärt wird?

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6

309 Beiträge seit 2020
vor 2 Jahren

Edit: Kann es sein, dass das Thema selbst in
>
nicht behandelt wird oder suche ich im Inhaltsverzeichnis nach etwas, das dort anders bezeichnet ist?

Kennt jemand Linkedin Learning und weiß zufällig, ob dort das Thema anschaulich erklärt wird?

Das hat weniger speziell was mit C# zu tun sondern mit Software Architektur.

Wer hat denn die Website gemacht bzw. mit was wurde die gemacht? Vielleicht könnte man die ja um eine API erweitern

16.806 Beiträge seit 2008
vor 2 Jahren

Kennt jemand Linkedin Learning und weiß zufällig, ob dort das Thema anschaulich erklärt wird?

Das soll jetz nich unfreundlich sondern nur ehrlich sein, aber Dir fehlen sehr viele Grundlagen für dieses Thema, sodass das nicht mit einem kleinen Video erklärt sein wird 🙂
Da gehts um grundlegende Dinge wie Solution Architecture (wie eben das Client Server Modell), was eigentliche Protokolle sind (SSH, HTTP..), was Paradigmen sind (REST und Co).... und dann eben um die Software Architektur, wie Du eine Kommunikation zwischen zwei Anwendungen ermöglichst.

Ich seh ehrlich gesagt auch in Deinem Fall keinen Weg, wie Du drum herum kommst, weil Dein VPN-Weg wird eine Sackgasse sein.
Das ist einfach ein Quasi-Standard im Internet, wie hier Anwendungen kommunizieren (sollen).

Ich will Dir nur damit sagen, dass Du kein Tutorial finden wirst, das alles komplett auf einmal behandeln wird, weil das einfach mehrere Themen / Themenfelder sind, die hier die Gesamtlösung darstellen.

L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor 2 Jahren

Die Webseite habe ich gemacht und hält neben dem üblichen HTML und CSS eigentlich nur den PHP-Block zur Abfrage der Daten aus der Datenbank. Der einzige Insert der statt findet ist eigentlich nur die Seriennummer des Rechners die ich eintrage (und über die findet das Programm dann den passenden Rechner) und einige Daten, die die Buchhaltung eintragen kann (Rechnungsdatum, Kostenstelle...) Mehr passiert da nicht. Sieht so aus (Noch nicht fertig, fehlt jegliche Rechteprüfung) Ich hoffe ihr schlagt hier nicht auch schon wieder direkt die Hände überm Kopf zusammen. "control" steht in dem Fall für das "Controlling", nicht für ein Steuerelement.


<?php session_start();

# Diese Datei enthält Funktionen, welche für das Script zwingend benötigt werden.
require_once("../functions.inc.php");
# Diese Datei enthält die Fehlercodes.
require_once("../codes.php");

# Datenbankverbindung herstellen
$db_connect = db_connect();

// Prüfen, ob das Formular abgeschickt wurde.
if(isset($_POST['computerSave'])) {

	// Prüfen, ob Seriennummer gesetzt ist.
	if(empty($_POST['computerSerial'])) {
		# Code 13 = "Es wurden nicht alle Pflichtfelder ausgefüllt."
		$_SESSION['code'] = 13;
		header("Location: http://".$_SERVER['HTTP_HOST']."/computer/show.php"); exit;
	}
        # Prüfen, ob der Computer bereits angelegt wurde
        $db_read = $db_connect->prepare('select computerSerial from db_computer where computerSerial=?');
        $db_read->execute([$_POST['computerSerial']]);
        $number = $db_read->rowCount();
        # Falls ein Eintrag gefunden wurde, Vorgang abbrechen
        if($number >= 1){
            # Code 30 = Den Computer gibt es bereits."
            $_SESSION['code'] = 30;
            header("Location: http://".$_SERVER['HTTP_HOST']."/computer/show.php"); exit;
        }
    else {
        $db_insert = $db_connect->prepare("Insert into db_computer (computerSerial, controlBillDate, fk_controlCostcentre, controlInvestmentNumber, controlCheckNumber, controlExpires, otherComment, controlFirstEntry) VALUES (:computerSerial, :controlBillDate, :fk_controlCostcentre, :controlInvestmentNumber, :controlCheckNumber, :controlExpires, :otherComment, :controlFirstEntry)");
        $db_insert->execute([
            'computerSerial' => $_POST['computerSerial'],
            'controlBillDate' => $_POST['controlBillDate'],
            'fk_controlCostcentre' => $_POST['fk_controlCostcentre'],
            'controlInvestmentNumber' => $_POST['controlInvestmentNumber'],
            'controlCheckNumber' => $_POST['controlCheckNumber'],
            'controlExpires' => $_POST['controlExpires'],
            'otherComment' =>  $_POST['otherComment'],
            'controlFirstEntry' => date('Y-m-d')
        ]);

		# Code 10 = "Eintrag gespeichert."
		$_SESSION['code'] = 10;
		header("Location: http://".$_SERVER['HTTP_HOST']."/computer/show.php"); exit;
    }
}
else
{
	header("Location: http://".$_SERVER['HTTP_HOST']."/computer/show.php"); exit;
}
$db_connect->close();
?>

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6

L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor 2 Jahren

Ich habe endlich ein Video gefunden und ich glaube es sogar verstanden zu haben. Taugt das was? Sieht sehr einfach aus.
Wäre vielleicht noch cool, wenns per post gehen würde, anstatt über get.

Edit: Das hier scheint besser zu sein, sogar mit Rückmeldung an die WinForm

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6

2.078 Beiträge seit 2012
vor 2 Jahren

Warum mischst Du jetzt C# mit PHP?
Ich persönlich halte PHP in der heutigen Zeit für ein grausiges Chaos, das ich möglichst vermeiden würde 😁
Und selbst wenn ich es gut fände - ich würde keine zwei Welten mischen, wenn es sich doch eigentlich sehr gut nur mit C# machen lässt.

Dir wurden schon alle notwendigen Technologien genannt: ASP.NET Core und Refit, beides kannst Du mit C# nutzen.

Die Doku von Microsoft zu ASP.NET Core (von Abt verlinkt) ist ziemlich gut, leider bringt dieses Framework auch einige Konzepte mit, die für einen Einsteiger etwas schwierig zu verstehen sind. Dennoch solltest Du das weiter verfolgen, nicht nur, weil dir das einiges an Arbeit ersparen kann, sondern weil Du so gleichzeitig einige Dinge aus dem riesigen Themengebiet Softwarearchitektur und Designpatterns lernst - also das, was Du in deinem Buch vermisst hast und das darin garantiert jeden Rahmen gesprengt hätte. Wie gut das für einen blutigen Einsteiger geeignet ist, kann ich nicht sagen, aber Du hast auf jeden Fall eine Grundlage, an der Du dich entlang hangeln und ggf. fehlendes Wissen anderswo auffrischen kannst.

Und Refit macht den zusätzlichen Aufwand der Gegenseite (deine WinForms-Anwendung) sehr einfach, jedenfalls kenne ich keinen einfacheren Weg, sowas zu machen.

Also nochmal grob umrissen:
Du brauchst eigentlich zwei Programme: Die Server- und die Client-Anwendung, daher auch "Server-Client-Architektur".

Die Server-Anwendung läuft auf irgendeinem gemieteten Server und ist im Internet oder Intranet erreichbar.
Sie darf als einziges Programm mit der Datenbank arbeiten und kann (je nachdem, wie Du das aufbaust) auch einiges an Logik übernehmen, dann muss das nicht in der Client-Anwendung entwickelt werden.
Die Server-Anwendung wird mit ASP.NET Core entwickelt.

Die Client-Anwendung läuft auf den PCs, wo Du dein Programm laufen lassen willst und brauchen eine Verbindung zu dem Server.
Dieses Programm darf nicht mit der Datenbank sprechen, sondern "fragt" die Server-Anwendung, ob sie bestimmte Daten herausgeben oder ändern kann, dafür schickt sie normale HTTP-Anfragen zum Server, Inhalte erden über die URL oder als Inhalt von Form von JSON übermittelt. Die Server-Anwendung prüft diese Anfrage (kann ggf. ablehnen, wenn was falsch ist) und erfüllt ggf. die Aufgabe. Die Client-Anwendung zeigt dann nur noch die Ergebnisse an.
Die Client-Anwendung ist deine WinForms-Anwendung und kommuniziert mit der Server-Anwendung, Refit vereinfacht das enorm.
Auf die Registry zugreifen geht auch, ist ja ein normales WinForms-Programm auf Windows-PCs, die Informationen musst Du dann mit zum Server schicken.

Ach ja:
Nutze bitte eine Quellcodeverwaltung - falls Du es noch nicht tust.
Das hast Du dir mit wenig Arbeit eingerichtet, kannst dir leicht verschiedene Stände pflegen und verlierst nichts bei deinen Experimenten oder z.B. einem Hardware-Problem.

Und lass PHP aus dem Spiel.
Wenn Du das so machst, wie gezeigt, musst Du praktisch alles selber machen.
Oder Du verwendest fertige Frameworks, die es sicher auch für PHP gibt, dann stehst Du aber wieder vor dem Problem, dich in großes Framework einarbeiten zu müssen - noch zusätzlich zur anderen Programmiersprache mit einem ganz anderen Ökosystem drum herum.
Dann kannst Du auch gleich ASP.NET Core lernen.

L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor 2 Jahren

Ja, ihr gebt mir wertvolle Tipps und Hilfestellungen. Das merke ich und versuche auch damit zurecht zu kommen. Aber ich fühle mich total überfordert 😦. Das Tutorial von der Microsoft-Seite verstehe ich nicht. Ich suche einfach ein ordentliches Beispiel, wo das ganze anschaulich, möglichst auch noch deutsch weil kompliziert genug, erklärt wird.

Warum ich PHP dafür verwenden will? Naja, bin zufällig drauf gestoßen und da ich PHP (mehr oder weniger) auch gut kann und mir vertraut ist und das scheinbar auch ohne Umwege funktioniert dachte ich, dass man das auch so machen kann. C#-Anwendung schickt Anfrage an PHP-Script-> PHP-Script macht die Datenbankeintrag. Einfacher könnte es für mich nicht sein und ich konnte den Vorgang nachvollziehen und habs verstanden.

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6

16.806 Beiträge seit 2008
vor 2 Jahren

Keiner hier kannte Dein PHP Script. Du hast immer davon geredet, dass der WinForms Client mit der Datenbank redet, was falsch wäre in der Umsetzung.

Natürlich kann WinForms auch einfach die Daten an das PHP Script schicken.
Das PHP Script würde dann die Rolle des Web Services einnehmen und stellt strukturell eine valide Umsetzung als Server da.
Inhaltlich ist aber auch dein PHP Script nicht ideal (und einige Fehler drin, was das Thema Wertesicherheit betrifft) aber es ist im Welten besser als wenn dein Client mit der Datenbank über das Internet kommunizieren würde.

Wenn du dich bei Tutorials überfordert fühlst, dann ist das meist ein Zeichen, dass die Grundlagen fehlen und du vielleicht ein paar Schritte zuviel übersprungen hast.
Stell dir selbst kleine Aufgaben, geh strukturierter an die Sache ran. Niemand ist mit dem Wissen geboren, wir haben alle mal angefangen.
Aber wir können dir das lernen halt leider auch nicht abnehmen.

L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor 2 Jahren

Danke für deine Worte.

Also das gepostete PHP-Script ist natürlich vom Webinterface und hat nichts mit der C#-Anwendung zu schaffen. Deswegen hatte ich es nie erwähnt. Ich hatte das nur gepostet, weil JimStark (mehr oder weniger) danach gefragt hat. Das PHP-Script, dass mit C# zusammen arbeiten soll müsste ich erst noch erstellen und wird dann auch nur Update-Befehle ausführen, keine Inserts und keine Deletes! (Anlegen der Computer in der Datenbank (mit Seriennummer) und Löschen erfolgen über das Webinterface). Ob die C#-Anwendung ein Select benötigtet muss ich gucken, ich glaube aber nicht. Ich wollte aber erstmal abklären, ob das mit PHP überhaupt Sinn ergibt, bevor ich das mache nur um es am Ende enttäuscht in die Tonne treten zu müssen.

Wenn wir aber schon dabei sind, einfach kurz zwischenrein:
Bist du noch so nett und sagst mir, was an dem geposteten PHP-Script nicht optimal ist? Bislang hieß es immer PDO sei sicher und man muss sich nicht wie bei MYSQL, bzw. MySQLi um das absichern der Variablen und Strings kümmern, weil das by design schon gegeben ist. Deswegen habe ich mich auch da umgestellt und den Absprung von der alten Methode geschafft. Gilt das nicht mehr?

Was ich inzwischen noch gemacht habe ist, den $db_connect erst innerhalb der if(isset($_POST['computerSave']))-Variable zu setzen. Ich glaube das ist aber egal, erscheint mir nur logischer vom Ablauf her.

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6

309 Beiträge seit 2020
vor 2 Jahren

Ich hatte das nur gepostet, weil JimStark (mehr oder weniger) danach gefragt hat.

Mein Ziel war es ehr dass das vielleicht jemand gemacht hat der sich damit auskennt. Ich kenn mich selbst mit PHP überhaupt nicht aus, denke aber da kann man mit Frameworks ähnlich schnell Http-Apis bauen wie mit Asp.Net.
Aber die Seite sollte ja im besten Fall auch irgendwie abgesichert sein, wie machst du es denn da bzw. wie planst du es?
Bringt ja nichts wenn du die API super absicherst und die Website ist mit einem selbstgebauten Loginformular ausgestattet.

Hier ASP.NET Web APIs | Rest API's with .NET and C# ist alles relevante für dich verlinkt, meiner Meinung sind die Docs um Längen besser als jedes Videotutorial, aber das ist geschmackssache.
Wenn du umbedingt Videos willst, kann ich folgendes sehr empfehlen, er erklärt wirklich alles was du brauchst:
C# with CSharpFritz S2 E4 - APIs with ASP.NET Core

16.806 Beiträge seit 2008
vor 2 Jahren

Bislang hieß es immer PDO sei sicher und man muss sich nicht wie bei MYSQL, bzw. MySQLi um das absichern der Variablen und Strings kümmern, weil das by design schon gegeben ist. Deswegen habe ich mich auch da umgestellt und den Absprung von der alten Methode geschafft. Gilt das nicht mehr?

Weiß nicht ganz, was Du gelesen hast, aber Gegenteiliges geschrieben hat das zumindest keiner.

Ich habe geschrieben

Inhaltlich ist aber auch dein PHP Script nicht ideal (und einige Fehler drin, was das Thema Wertesicherheit betrifft)

Beachte dabei das Wort: Wertesicherheit.

Du nimmst HTTP Parameter an und ohne jegliche Vorvalidierung haust Du diese in einen SQL Command.
Wenigstens die SQL Parameterumsetzung rettet dich nen bisschen.
Aber jeder mit nen bisschen IT Ahnung kann Dir halt jeglichen Bullshit in die Datenbank pumpen, bis sie platzt - oder ganz einfach das Script krachen lassen.

Nichts desto trotz: ja, als Script ist das wirklich die minimalste der minimalsten Lösungen und grenzwertig einfach unter jeden Vorbehalt, was man beachten sollte.
In Summe halt alles ein Ergebnis aufgrund von blindem Losprogrammieren. 🙂

M
368 Beiträge seit 2006
vor 2 Jahren

PDO sei sicher ...nicht für sich alleine, siehe https://phptherightway.com/#pdo_extension (kompl. Abschnitt)

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉

L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor 2 Jahren

Das ist zwar ein CSharp-Forum, aber ein bisschen wurde das Thema PHP hier ja angeschnitten. Ich hoffe es ist OK, wenn ich das hier etwas weiter führe, da ich mich eurer Ratschläge annehmen wollte. Außerdem wurde ich hier nicht direkt abgespeist und darauf verwiesen wieder zu kommen, wenn ich programmieren kann. Danke 🙂

Zunächst möchte ich mal den PHP-Teil in Ordnung bringen. Passend dazu kamen jetzt auch die Bücher zu PHP 8 bei mir an (Einstieg in PHP 8 und MySQL und PHP 8 und MySQL Das umfassende Handbuch)

Naja, im Einsteigerbuch wird PDO nur grob im Zusammenhang mit SQLite3 angerissen. Da wird mehr so auf MySQLi gesetzt. Im umfassenden Handbuch ist ein sehr schönes Beispiel drin, dass ich übernehmen habe und jetzt nachfragen wollte ob nun alle Aspekte abgedeckt sind oder noch was fehlt.


    else {
		try {				
	        $db_insert = ("Insert into db_computer (computerSerial, controlBillDate, fk_controlCostcentre, controlInvestmentNumber, controlCheckNumber, controlExpires, otherComment, controlFirstEntry) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
	        $data = [$_POST['computerSerial'], $_POST['controlBillDate'], $_POST['fk_controlCostcentre'], $_POST['controlInvestmentNumber'], $_POST['controlCheckNumber'], $_POST['controlExpires'], $_POST['otherComment'], date('Y-m-d')];
	        
	        $unklareVariable = $db_connect->prepare($db_insert);
			$unklareVariable->execute($data);
	        	        
	       # Datenbankverbindung schließen.
	       $db_connect->close();
	        
	    	# Code 10 = "Eintrag gespeichert."
			$_SESSION['code'] = 10;
			header("Location: https://".$_SERVER['HTTP_HOST']."/computer/show.php"); exit;
		} catch (PDOException $e) {
			echo 'Fehler: ' . htmlspecialchars($e->getMessage());
		}
    }

Die Variable, die ich "$unklareVariable" genannt habe ist mir tatsächlich unklar. Sie wird zugewiesen, kommt aber nirgends zum Einsatz?

Davon abgesehen hatte ich beim Umschreiben noch Fehler im try-Block, aber der catch-Block funktionierte nicht. Was ich so ergoogelt habe ist das try/catch in PHP auch nicht vorgesehen. Wieso wird das dannin dem Buch verwendet, bzw. wenn mittlerweile doch, warum kam er nicht zur Anwendung?

Das Datenbankverbindung schließe, also $db_connect->close(); kommt in dem Beispiel nicht vor, finde das aber sauberer. Oder braucht es das gar nicht, bzw. ist aus anderen Gründen Blödsinn?

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6

L
LittleTester Themenstarter:in
158 Beiträge seit 2019
vor 2 Jahren

Upsi, jetzt kann ich nicht mehr editieren:

Also das


	       # Datenbankverbindung schließen.
	       $db_connect->close();

habe ich rausgenommen, weils nen Fehler wirft. (Hatte es vorher auskommentiert)

Habe es durch


			$db_insert = NULL;
			$db_connect = NULL;

ersetzt. Gut so?

IDE: Visual Studio 2022
Sofern nicht anders genannt basieren meine Projekte auf C# und .net 6

M
368 Beiträge seit 2006
vor 2 Jahren

try/catch in PHP auch nicht vorgesehen. starke Spekulation: der Server verwendet eine zu alte PHP-Version (oder anderweitig zu alte Software). Ansonsten gibt es try/catch/finally auch in PHP, siehe PHP: The Right Way

Goalkicker.com // DNC Magazine for .NET Developers // .NET Blogs zum Folgen
Software is like cathedrals: first we build them, then we pray 😉