Entwickler-Ecke

Datenbanken (inkl. ADO.NET) - Kundendatensammlung in Datenbank


Csharp-programmierer - Mi 03.08.16 20:39
Titel: Kundendatensammlung in Datenbank
Hallo Community,
ich habe eine Idee. Wenn man sich über ein Netzwerk anmeldet, soll man die Software als Vollversion bekommen. Diese Kundendaten müssen aber nun serverseitig irgendwie gespeichert werden. Ich hätte es jetzt so gemacht, dass eine Email mit den Daten losgeschickt wird, aber das ist blöd, da es per Email keinen Primary key gibt.

Nun meine Frage: kann man eventuell einen kostenlosen Server hosten, der als Kundendatenbank dient? Ich muss dann aber auf die Datenbank zugreifen können, um die Kundendaten einsehen zu können.
Geht das überhaupt kostenlos? Und muss man dafür einen SQL Server installieren?
netzwerk


Palladin007 - Do 04.08.16 00:24

Kostenlos:
Ja, wenn Du einen Zuhause rum stehen hast :P
So ein Server kostet Geld und das nicht zu knapp, dazu kommt noch die Wartung, die auch nicht ganz billig ist.

Kundendaten per Email schicken:
Warum EMail? Dafür wurde das nicht gemacht, Du baust nur Murks zusammen, der mehr Overhead drum herum braucht, als eigentlich nötig.
Warum kein FTP-Upload der Daten?
Oder Du schickst eine POST-Anfrage an den Server, wo Du die Daten mit schickst.
Beides habe ich aber bisher nur mit PHP und JavaScript gemacht und das ist auch schon etwas her.

Brauchst Du einen SQL-Server:
Nein, wie Du die Daten ablegst ist deine Sache, kann auch eine CSV-Datei pro Kunde sein.
Ist ein SQL-Server sinnvoll? Das ist ganz andere Geschichte, ich denke aber, mit einem SQL-Server ist man immer auf der sicheren Seite.


Wenn der Server nur sowas wie Registrierungsdaten sammeln soll, dann würde ich mir dazu einen Linux-Server mieten.
MySql-Server gibt's kostenlos und das entgegen nehmen von Kundendaten bzw. raus schicken ist mit PHP ziemlich schnell gemacht. Für die Verschlüsselung gibt's auch genug Möglichkeiten.


Zitat:
da es per Email keinen Primary key gibt

Der Primary Key auf der Datenbank?
Den gibts überall, musst Du nur mit schicken, schließlich ist das auch nichts anderes als ein einfacher Wert, der eben eindeutig sein soll.
Der muss dann auf dem Server nur entsprechend beachtet werden und das läuft bei PHP grob betrachtet nicht sehr viel anders als bei C#.


Csharp-programmierer - Do 04.08.16 08:34

Stimmt. Die Sache mit dem FTP Server gefällt mir schon ganz gut. Man könnte den Dateinamen als PrimaryKey verwenden. Dann überprüfen, ob es diesen schon gibt...

Darauf bin ich nicht gekommen. Danke :)


Palladin007 - Do 04.08.16 08:41

Brauchst Du überhaupt FTP?

Wenn die Daten kein komplexes Format haben, also bzw. nur Benutzer-Daten in Form einer Liste beinhalten, dann würde ich das per POST-Anfrage zum Server schicken.
Da kannst Du dann beliebige Daten mit schicken, z.B. so: .NET: Simplest way to send POST with data and read response [http://stackoverflow.com/questions/4088625/net-simplest-way-to-send-post-with-data-and-read-response]

Das ist auch seitens PHP leichter anzunehmen.
Da brauchst Du nur die $_POST [http://php.net/manual/de/reserved.variables.post.php]-Variable nutzen, da hast Du dann wieder die Daten


Csharp-programmierer - Do 04.08.16 09:06

Aber wo werden die Daten dann mit der POST Anfrage abgespeichert?


Palladin007 - Do 04.08.16 09:18

Gar nicht, musst Du machen
Musst Du bei FTP aber auch machen


Csharp-programmierer - Do 04.08.16 09:25

Aber wenn ich einen FTP-Server miete, bekommt dieser Server ja eine Domain wie ftp://server...

Dann kann ich ja die Methode upload Data auffufen, um Dateien auf den Server zu spielen, oder?


Palladin007 - Do 04.08.16 09:32

Ich muss gestehen, ich weiß nicht genau, wie das da gemacht wird
Aber ich weiß, dass Du dir die Daten vorher nochmal anschauen solltest, sonst kann ja jeder Idiot alles hoch laden ;)
Und da ist denke ich die POST-Anfrage besser geeignet.

Das wird glaube auch in den meisten Fällen so gemacht. Meldet sich irgendwer irgendwo an, wird eine POST-Anfrage mit den optimalerweise auch verschlüsselten Daten an einen entsprechenden Registrierungs-Server geschickt. Der nimmt die dann entgegen, prüft sie gegen und legt sie dann in der Datenbank ab. Das Gleiche auch beim Login, nur dass da nicht gespeichert wird, sondern nur gesagt wird ob die Daten so in der Datenbank stehen oder nicht.


Csharp-programmierer - Do 04.08.16 10:03

Wenn ich mir den Quellcode von der POST Anfrage mal so ansehe, sieht es so aus, als ob die Daten auf einer Website gespeichert werden.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
byte[] response = Http.Post
(
    url: "http://dork.com/service",
    contentType: "application/x-www-form-urlencoded",
    contentLength: 32,
    content: "home=Cosby&favorite+flavor=flies"
);


Da wird ja eine Verbindung mit einer Website hergestellt, und dann darauf irgendwelche Daten gespeichert, oder? Wenn ja, dann ich dies doch irgendwie unsicher, oder verstehe ich das falsch?


Palladin007 - Do 04.08.16 10:58

Du kannst nicht einfach auf irgendeine Website Daten abspeichern.

Wenn Du eine Website öffnest, dann passiert im Hintergrund folgendes:
Der Web-Broser schickt eine Anfrage zu dem Server und liefert einige Variablen mit, die weitere Informationen wie z.B. die Browser-Version beinhalten.
Unter diesen Variablen finden sich auch die Variablen $_GET und $_POST
$_GET beinhaltet in Form einer Key-Value-Zuordnung die Daten, die in der URL hinter dem Fragezeichen stehen, getrennt durch das kaufmännische Und-Zeichen. Ich hab z.B. aktuell da stehen: mode=reply
$_POST ist im Prinzip das gleiche, nur dass der User die Inhalte nicht so einfach über die URL angeben kann, sondern die Daten nicht direkt sichtbar sind. Das kann genutzt werden, wenn z.B. die Website Informationen zum Server schicken will.

Auf dem Server dagegen passiert genau nichts, der würde die Anfrage abweisen.
Zumindest wenn Du keine entsprechende URL verfügbar machst, z.B. indem Du eine Datei unter dem Pfad mit dem Namen an gibst.
Ist das eine PHP-Datei, ist da dann alles offen, was mit den mit geschickten Daten passiert. Ob Du die nun verwendest um eine Datei zu schreiben, was in der Datenbank zu aktualisieren oder eine Website anzuzeigen ist völlig egal. Du kannst aber auch Daten zurück schicken, damit der Client auch eine Antwort erhält. Du kannst auch eventuell zurück geschickten HTML-Code abfragen und anzeigen, das würde der Browser tun.



Es ist auch nicht pauschal besonders sicher oder unsicher, die Anfrage zu stellen. Wie sicher das ist, hängt immer vom Server ab, wie der eingerichtet wurde, die die Daten übertragen werden und wie Du beim Annehmen der Daten damit umgehst. Es ist z.B. ein absolutes NoGo, sowas wie Login-Daten unverschlüsselt zu übertragen, das würde Firefox dir als Nutzer auch mit teilen.
Das Gleiche hast Du bei FTP aber auch, Du kannst die Daten verschlüsselt übertragen oder eben nicht und wie die Daten angenommen werden, steht auch wieder auf einem anderen Blatt.


Csharp-programmierer - Do 04.08.16 20:26

Naja mit Logindaten wird das erstmal nichts. Ich hätte einen Laptop noch, den ich relativ selten benutze. Kann man den irgendwie als FTP Server einrichten, und die Daten auf meiner externen Festplatte abspeichern? Dann könnt ich von zu hause darauf zugreifen. Das Problem ist aber, dass ich dann Angst habe, gehackt zu werden.


Palladin007 - Do 04.08.16 20:31

Klar geht das, wie musst Du aber selber heraus finden, da kenne ich mich nicht aus.
Auch bei der Sicherheitsfrage kann ich nicht helfen, aber ich wette, da gibt's mehr als genug Hilfe im Internet

Abgesehen davon: Was will denn jemand mit deinem Laptop? :D
Solange Du die IP-Adresse oder URL nicht öffentlich zugänglich machst, wird da wohl keiner so schnell drauf aufmerksam. Zum Testen reicht das also denke ich völlig aus.


PS:
Aber Du kannst anfangs ja regelmäßig die Logs kontrollieren.
Ich weiß nicht, wie oft die Anfragen kommen, wenn das nicht so viele sind, dürften unerwartete Anfragen recht schnell auffallen.


Csharp-programmierer - Do 04.08.16 22:21

Okay. Dann würde ich es erstmal ohne FTP Server versuchen. Aber ich verstehe das überhaupt nicht, wie das mit der Website funktioniert. Kannst du mir das vielleicht genauer erklären?
Pro "Kunde" soll eine XML Datei erstellt werden, die auf einem Server gespeichert wird. Der Dateiname der XML Datei soll dann die Kundennummer (die es nur einmal geben soll) beinhalten. Ich möchte dann aber alle Daten einsehen können.


Palladin007 - Do 04.08.16 23:16

Ich werde dir hier jetzt bestimmt keinen "Wie richte ich einen Server ein und programmiere PHP"-Crashkurs geben, das können andere besser :D
Aber irgendwoher muss ich mein Wissen ja auch haben, die Community rund um Linux, Apache, PHP und MySql ist riesig, es gibt auch ein paar Seiten, denen Du immer wieder begegnen wirst, weil die wirklich hervorragende Dokumentationen, Tutorials, etc. bieten. Ich würde sogar behaupten, dass es in diesen Bereichen mehr Material und vor allem auch besseres Material gibt, als für die .NET-Welt.


Aber trotzdem in ganz super kurz:
Ich kenne es unter Linux mit Apache und MySql

- Apache installieren
- Den automatisch angelegten html oder http-Ordner suchen (oder in der Config nach schauen, Doku-Material dazu gibt's sehr viel)
- Darin liegt eine HTML-Datei mit einer simplen Vorschau-Seite, die auch angezeigt werden kann
- Die HTML-Datei löschen und stattdessen eine PHP-Datei erstellen
- In die PHP-Datei folgendes rein schreiben:


PHP-Quelltext
1:
2:
3:
<?php
var_dump($_GET);
?>


- Die URL "127.0.0.1/MyPhpFile.php?Field1=Value1&Field2=Value2" aufrufen und staunen

Wie das ganze mit der POSt-Variable geht, steht im Link, den ich gepostet habe. Aber nicht in der Frage, man sollte sich auch mal die Antworten dazu durchlesen, da stehen meistens die klugen Sachen. ;) Da wird nämlich auch eine fast schon lächerlich einfache Variante gezeigt, Daten an einen Server zu schicken.
Datei-Upload sieht da aber etwas anders aus, da musst Du dich mal schlau machen, das weiß ich jetzt aus dem Kopf auch nicht.

Wie Du die Daten weiter verarbeitest, ist auch wieder was anderes. Ich persönlich bin kein Fan von dateibasierter Datenhaltung, wenn das keine großen Probleme macht oder dateibasiert sein muss, würde ich immer die Datenbank nehmen.
Für PHP gibt es eine hervorragende Dokumentation und die wirst Du auch brauchen, da PHP schwach typisiert ist und eine Methode nicht zwangsläufig immer das gleiche bekommt oder zurück gibt. Und es gibt für jeden Mist irgendwo Tipps, Snippets, Frameworks, etc.
Genauso auch für MySql



Zwei Seiten, die Du lieben lernen wirst:
https://wiki.ubuntuusers.de/Apache/
http://php.net/manual/de/mysqli.quickstart.php



PS:
Installier dir eine Linux-VM und probier da einfach rum. Solange die VM nicht von außen antelefoniert werden kann, kann dich auch niemand hacken und selbst wenn: Es ist nur eine Test-VM :D
Ich nutze dafür gerne VirtualBox. Die kostenlose (nicht kommerzielle) Version kann Snapshots, dann kannst Du die zurück spielen, wenn Du das Linux kaputt gespielt hast
Den Server kannst Du dann auch bequem auf dem Host-Rechner testen. Unter VirtualBox kannst Du einstellen, dass nur der Host die VM im Netzwerk sieht und die VM bekommt über den Host Internet-Zugang, was Du auch brauchst, da es das Installieren von Programmen auf Linux deutlich einfacher macht - einfacher als unter Windows

Ach ja: Gewöhn dich am besten gleich an die Konsole, Du wirst da immer wieder mal was mit machen müssen, also am besten gleich alles.
Anfangs hab ich mich da schwer getan, allerdings ist die Konsole unter Linux deutlich (!!!) flexibler als die von Windows und Du hast dort extrem viele Möglichkeiten. Es gibt sogar ein Tool, was dir in der Konsole einen grafischen Datei-Explorer baut: Midnight Commander [https://wiki.ubuntuusers.de/Midnight_Commander/]
Nach etwas Eingewöhnungszeit und der Hilfe von wiki.ubuntuusers.de gewöhnt man sich da aber schnell dran, dann macht's richtig Spaß ^^
Ich kann zu Linux und der Art, wie man damit arbeitet eigentlich nur sagen: Top :zustimm: Wenn ich dann nicht auf so viele Programme verzichten müsste, würde ich direkt umsteigen.


Csharp-programmierer - Do 25.08.16 15:33

Okay, ich habe mich jetzt entschieden, einen FTP Server zu mieten.
Nun habe ich eine Frage: Um an die Daten zu gelangen, braucht man ja ein Passwort. Wenn ich aber das Serverpasswort in dem Programm mitliefere, hab ich "Angst", dann man es auslesen (decompillieren) kann. Gibt es vielleicht eine andere, sicherere Variante, um das Passwort als Parameter einer Methode mitzugeben?


Csharp-programmierer - So 28.08.16 17:50

Oder kann ich von einem Rechner einen SQL Datenbankserver hosten? Ich habe heute nämlich gehört, dass FTP sehr unsicher ist und Datenbanken sind ja darauf spezialisiert, eine ganze Menge von Daten aufnehmen zu können. Geht das irgendwie, dass ich meinen Rechner als SQL Datenbankserver hoste?


Ralf Jansen - So 28.08.16 18:17

Zitat:
Oder kann ich von einem Rechner einen SQL Datenbankserver hosten?

Ich vermute mal eine rein rhetorische Frage?

Zitat:
Ich habe heute nämlich gehört, dass FTP sehr unsicher ist und Datenbanken sind ja darauf spezialisiert, eine ganze Menge von Daten aufnehmen zu können.

Was hat Sicherheit jetzt mit Datenmenge zu tun? Ein direkt ansprechbare Datenbank ist erstmal genauso sicher/unsicher wie FTP. Sobald dir Credentials für ein Protokol abhanden kommen kann ein Angreifer alles tun was dieses Protokoll zulässt (bei FTP alles leerräumen, bei einer Datenbank die DB löschen). Wenn du mehr Sicherheit willst musst du eine dezidierte Anwendung mit einer dezidierten Schnittstelle auf einem Server bereitstellen. Wenn dann Zugangsdaten ~verloren~ gehen ist nur die bereitgestellte Funktionalität nutzbar aber nicht einfach alles. Das wäre ien tatsächlicher Sicherheitsgewinn.

Zitat:
Geht das irgendwie, dass ich meinen Rechner als SQL Datenbankserver hoste?

Ob es jetzt dein Rechner ist, der Rechner eines Freundes oder ein irgendwo gehosteter PC natürlich geht das. Ein Rechner ist ein Rechner ist ein Rechner.
Die eigentliche Frage ist macht das Sinn? Da kommt es dann auf den Kontext deiner Anwendung an den wir nicht kennen(Also z.B. wie kommen die Nutzer übers Netz an deinen Rechner, was sind das für Nutzer, wo sind die Nutzer, wie viele Nutzer hast du vorraussichtlich, wann brauchen die Nutzer diesen Dienst, wie viele Daten schieben durchschnittlich hin und her, was für einem Sicherheitsanspruch muss dem genügen u.s.w.) viel zu viele Fragen die offen sind. Und ein einfaches immer gültiges A ist besser als B gibt es nicht (in unserem Geschäft sowieso niemals).
Im allgemeinen macht es üblicherweise keinen Sinn irgendeinen Rechner zu nehmen sondern je nach notwendiger Erreichbarkeit (lokales Netz, Internet, VPN etc.) will man einen dezidierten Rechner in der passenden Sicherheitszone.


Csharp-programmierer - So 28.08.16 19:11

Also letzendlich möchten wir unser eigenes Netzwerk aufbauen. Über dieses Netzwerk sollen die User unseres Programms E-Mail Newsletter bekommen und [später] auf unserer Website zugreifen können. Und diese Anmeldedaten, Name usw. der User müssen nun irgendwie Serverseitigt gespeichert werden. Wie viele sich dort anmelden, kann ich pauschal nicht sagen, ich rechte aber so um die 75. Der Rechner, der die Daten speichern soll, befindet sich in einem Heimnetzwerk, was von einem Router gesteuert wird.

Wie die Daten letzendlich gespeichert werden, ich meiner Meinung nach sekundär, hauptsache die Daten werden (relativ) sicher auf dem PC gespeichert. Die Daten werden (vorraussichtlich) nur versenden der Newsletter und zur Anmeldung auf unserer Website gebraucht. Eventuell kann man dieses Netzwerk später weiter ausbauen.


Ralf Jansen - So 28.08.16 20:00

Wenn du eh einen Webserver brauchst dann kannst du da auch einfach eine simple Webanwendung mitlaufen lassen die deine Kundendaten entgegen nimmt (egal ob die jetzt direkt http(s), rest, soap oder was auch immer spricht). Wo die dann die Kundendaten ablegt in einer DB, einem File oder oder ... egal.


Csharp-programmierer - So 28.08.16 20:18

Was genau ist eine Webanwendung? Einfach ein Programm, was 24/7 auf dem Server läuft und dann die Daten abspeichert, oder wie?
Ich habe schonmal nach ein paar Webhosting Angeboten geguckt und bin nur auf FTP uns MySQL gestoßen, aber heute habe ich erst gehört, dass FTP relativ unsicher ist. Und das Programm dann vollautomatisiert auf den FTP Server zugreift, muss ich im Quellcode ja das Passwort für den Server mitgeben und da weiß ich nicht, ob man auch ohne SourceCodes irgendwie an den Quellcode herankommt.


Ralf Jansen - So 28.08.16 21:07

Zitat:
Was genau ist eine Webanwendung? Einfach ein Programm, was 24/7 auf dem Server läuft und dann die Daten abspeichert, oder wie?


Das Ding das da 24/7 läuft ist ein Webserver. Der würde deine Webseite hosten. Aber genauso wie ein Webserver anfragen annehmen und html ausliefern kann um sie im Browser anzuzeigen kann der auch irgendwelche anfragen annehmen und irgendwas ausliefern um irgendwas anderes zu tun es müssen nicht Webseiten sein. Alles was hauptsächlich auf einem Webserver läuft und nicht primär in einem Client(egal ob dort in einem Webbrowser oder irgendeinem anderen Clientprogram) bezeichne ich als Webanwendung. Die genaue Definition kannst du aber auch einfach in der Wikipedia nachlesen.

Zitat:
muss ich im Quellcode ja das Passwort für den Server mitgeben


Ab dem Punkt ist eh alles unsicher egal was du tust. Da ist es egal ob FTP/HTTP/Datenbankprotokol etc. nimm näherungsweise an das du mit einem offenen Geheimnis unterwegs bist. Du kannst das Risiko nur minimieren indem man einfach nichts wirklich schlimmes machen kann wenn man die Credentials aus deiner Anwendung raus puhlt. Mit dem FTP Protokoll und einem Datenbank Protokoll darf man meist eigentlich schon viel zu viel. Eine simpler Http Endpunkt in einem Webserver der genau nur das kann was benötigt wird (z.b. irgendeine simple Anfrage mit Kundendaten annehmen) ist da relativ ungefährlich und schwer zu missbrauchen.


Csharp-programmierer - So 28.08.16 22:27

Okay. Ich habe mich mal ein bisschen über HTTP informiert. Also brauche ich den Apache HTTP Server?

Aber wie schreibe ich den Endpunkt so, dass er Daten an einen Server vermittelt? Läuft dann auf dem Endpunkt nicht einfach eine normale Website?


Palladin007 - So 28.08.16 23:03

Eine Website ist auch nichts anderes als ein Servide, der eben HTML-Code zurück gibt.
Das kann eine HTML-Datei sein oder eine PHP-Datei, die dann geparst wird.
Als Webserver kenne ich XAMPP, was aber nicht für den produktiven Einsatz gedacht ist - sagt ubuntuusers.de
Ander Webserver kenne ich aber nicht, kann also nur von dem ausgehen.

Wie man das einrichtet ist ganz einfach: Installieren und starten
Die Standard-Konfiguration reicht, damit der Webserver richtig funktioniert.
Eventuell muss man ihn noch starten.

Windows: https://blog.udemy.com/xampp-tutorial/
Ubuntu: https://wiki.ubuntuusers.de/XAMPP/
Ich persönlich finde es auf Linux angenehmer.

In der einfachsten Form reicht es dann im DocumentRoot-Verzeichnis des Werbservers die Dateien, die zugreifbar sind, anzulegen.
Das kann HTML oder PHP sein, ein Bild würde beispielsweise angezeigt werden.
HTML-Code wird vom Browser geparst und angezeigt, PHP-Code wird vom Webserver geparset und gibt das raus, was das Script produziert.

Da liegt normalerweise auch schon eine html-Datei mir einer Vorschau-Seite von XAMPP drin.
Da kann aber auch eine index.php rein, die wird dann aufgerufen, wenn Du localhost aufrufst.


Ralf Jansen - So 28.08.16 23:30

Zitat:
Also brauche ich den Apache HTTP Server?


Nein. du brauchst einen Webserver. Das kann ein Apache sein muss aber nicht. Apache bekommt man häufig bei den günstigen nicht Windows basierten Hostern. Meist in Form von XAMPP das Apache mit PHP, MySql und ein paar anderen Tools bundelt. Wenn du an .Net und Windows denkst wäre der IIS die Wahl. Windows/IIS Hosting ist jetzt aber nicht gerade das was man günstig nennen würde.
Andere Webserver wäre der Google eigene den man bekommt wenn man bei google hostet oder nginx.

Zitat:
Aber wie schreibe ich den Endpunkt so, dass er Daten an einen Server vermittelt?


Man sendet einen Http Request? Du solltest hier mal ein wenig Hintergrundbildung betreiben. Du bist an einem Punkt wo wir dich aufgrund des Umfangs nicht einfach an die Hand nehmen können das große ganze mußt du dir erstmal selbst erarbeiten, Bei den Details könen wir dann wieder weiterhelfen.

Dinge die du dir erarbeiten solltest/könntest
* Was genau jetzt http bedeutet
* was ist ein Get/Post/Put und was brauche ich davon
* was macht ein Browser und was müßte ich anderes ähnliches tun
* welche höheren Protokolle/Konzepte gibt es jenseits von http die man hier braucht bzw. brauchen könnte
* was bedeuten REST, SOAP, Webservice,
* welche serverseitigen (auf/im Webserver) Programmiertools/Kenntnisse brauche ich


Th69 - Mo 29.08.16 08:59

Hallo,

ich kann mich Ralf nur anschließen, daß WebServer-Installation und -Programmierung einiges an Wissen verlangt, daß du dir ersteinmal selber aneignen solltest (denn es unterscheidet sich von normaler Desktop-Programmierung schon sehr - sieht man u.a. auch an entsprechenden Stellenangeboten).
Als Ergänzung noch:
Wenn du eh C# als Backend (AppServer) verwendest, um auf die DB oder FTP oder ... zuzugreifen, dann wäre evtl. auch ASP.NET MVC [https://de.wikipedia.org/wiki/ASP.NET_MVC] von Interesse (da du dann nicht nur reines HTML oder PHP benutzen müßtest). Hier noch die Homepage mit Tutorial: Learn About ASP.NET MVC [http://www.asp.net/mvc].
Dann wäre allerdings der IIS als WebServer zu bevorzugen (falls die anderen überhaupt Plugins dafür anbieten).

Eines der wichtigsten inhaltlichen Themen für dein Projekt wäre dabei die Authentifizierung, s. z.B. Walkthrough: Using Forms Authentication in ASP.NET MVC [https://msdn.microsoft.com/en-us/library/ff398049(v=vs.100).aspx].


Csharp-programmierer - Mo 29.08.16 15:42

Also ich habe die ganze Sache jetzt so verstenden, dass ich mir einen Webserver installiere und auf diesem dann unter anderen eine PHP Datei hochlade. In dem Programm wird das PHP dann angefunkt und die Daten werden an diesen Script übergeben. Dann sorgt der PHP Script dafür, dass die übergebenen Daten auf einem Server gespeichert oder abgerufen werden, oder?

Nun hatte ich die Idee, mir einen Raspberry Pi zu kaufen, auf dem ich dann den Webserver (Apache 2 + PHP5) installiere. Dann hätte ich den Vorteil, dass die Website eine eigene Domain hat (und kein .weebly), und auf dem Pi dann gleich alle Kundendaten gespeichert werden und das alles dann für einmaliges Geld. Wie seht ihr das? Schafft der Pi diese Aufgabe?

Zum Thema WebRequest habe ich mir schonmal ein paar C# Videos angesehen, wie Kontakt mit dem PHP Script aufgenommen wird und dann Daten ausgegeben werden. Das war (glaube ich) über die POST Methode.


Ralf Jansen - Mo 29.08.16 16:03

Zitat:
Nun hatte ich die Idee, mir einen Raspberry Pi zu kaufen, auf dem ich dann den Webserver (Apache 2 + PHP5) installiere. Dann hätte ich den Vorteil, dass die Website eine eigene Domain hat (und kein .weebly), und auf dem Pi dann gleich alle Kundendaten gespeichert werden und das alles dann für einmaliges Geld. Wie seht ihr das? Schafft der Pi diese Aufgabe?


Du mußt dir, neben dem RasPi und einem Speichermedium, eine Dömane kaufen(eher mieten) und auch ein RasPi braucht Strom. Ansonsten ja das wäre eine Möglichkeit. Wobei mieten eines entsprechenden Systems (aus Webserver&Datenbank&Domäne) gibt es vermutlich schon im Bereich von Cents pro Monat. Es aus monetären Gründen selbst zu machen ist da eher nicht sinnig. Der Lerneffekt wäre aber natürlich ein ganz anderer wenn man es selbst macht ;)


Csharp-programmierer - Mo 29.08.16 16:17

Aber jetzt mal ehrlich. Wozu muss man eine Domain mieten? Ich meine letzendlich wird ja nur auf dem DNS Server ein neuer Eintrag vorgenommen. Zum Mieten habe ich auch schonmal geguckt, aber ich weiß nicht, worauf ich da achten muss. Oder ich behalte die Website von Weebly und richte den RasPi als Server ein, der die Kundendaten speichert. Dann bräuchte er ja keine Domain, wenn er nur von dem Programm angefunkt wird, oder?

Und meine "Theorie", wie das mit dem http Endpunkt funktioniert, ist richtig?


Ralf Jansen - Mo 29.08.16 16:27

Zitat:
Aber jetzt mal ehrlich. Wozu muss man eine Domain mieten? Ich meine letzendlich wird ja nur auf dem DNS Server ein neuer Eintrag vorgenommen.


Genau und diese DNS Server verbrauchen keinen Strom, die Hardware fällt kostenfrei vom Himmel und diejenigen die die pflegen sind vom Roten Kreuz und machen das ehrenamtlich wieso muss das also was Kosten :roll:

Zitat:
Und meine "Theorie", wie das mit dem http Endpunkt funktioniert, ist richtig?


Habe ich nicht verstanden. Du benennst zu prominent PHP. Womit ein Stück Software geschrieben ist ist doch eher egal. Du sprichst per Http mit einem Webserver. Der muss diese Anfrage irgendwie verarbeiten und anhand der Anfrage irgendwas sinnvolles ausführen(z.B. sich die Daten die in einem Http Request gekapselt sind nehmen und in einer DB ablegen). Das kann man z.B. mit PHP implementieren ist aber nebensächlich. Das ein Stück Software das sich auf deinem Rechner befindet in C# geschrieben ist ist ja auch erstmal egal für den Benutzer (jemand der eine Http Anfrage schickt ist für mich erstmal auch nur ein Benutzer). Wie er das Program bedient ist davon unabhängig. Das gleiche gilt beim Webserver auch.


Csharp-programmierer - Mo 29.08.16 16:29

Ohh sorry. Stimmt, daran habe ich jetzt gar nicht gedacht :oops:


Blup - Mi 31.08.16 10:49

Du solltest mal nach "webservice" suchen, vieleicht ist das der richtige Weg für deinen Anwendungsfall.


Csharp-programmierer - So 04.09.16 20:53

Okay, ich habe mich jetzt informiert, wie ein WebBrowser funktioniert und weiß nun, dass er nicht nur eine Website darstellt. In Hintergrund laufen auch sehr viel andere Kommunikationen zwischen dem Browser und den Servern. HTTP steht für Hyper Text Transport Protocoll und und ist ein Protokoll zum Transport von Websites und deren Diensten.

Nun würde ich auf meinem PI einen SQL Datenbankserver und einen Webserver installieren. Der Webserver beinhaltet eine .php-Datei, die Daten ein - und ausliest, und das 24/7. Desweiteren möchte ich einen SQL Server auf dem PI installieren (soweit das geht). Wird von der C# Anwendung eine Anfrage an den Webserver auf dem PI rausgeschickt, analysiert der PHP Script diese Anfrage, schaut eventuell in der Datenbank nach und liefert dann eventuelle Daten zurück. Und diese Daten stellt die C# Anwendung dann dar. Soweit habe ich das jetzt verstanden.

Nun habe ich einen Jungen angeschrieben, der auch 15 ist und gut PHP kann. Dieser meinte, man kann dieses Problem mit einer Socket-Netzwerkprogrammierung lösen. Das kann ich jetzt leider nicht einschätzen, ob das richtig oder falsch ist.

Das große Problem ist nun, dass ich keine Zeit habe, mir noch PHP beizubringen. Ich habe gerade mit dem Hauptprogramm und der Schule sehr sehr sehr viel zu tun. Das Programm muss fertig werden, dabei darf Schule nicht vernachlässigt werden. Und nun möchten wir noch ein Netzerk aufbauen. Ich möchte deshalb freundlich darum bitten, dass Leute, die das Problem verstehen und Lösungen dafür haben, mich per PN anschreiben, ich meine man muss das alles ja nur einmal einrichten, danach habt ihr dann auch Ruhe vor mir.

Also wer Ahnung von PHP hat, soll mich bitte per PN anschreiben. Das wäre echt nett.
Danke schonmal im Vorraus.


Csharp-programmierer - So 11.09.16 21:16

Also nun habe ich einen gefunden, der sich bereit erklärt, mir mit PHP zu helfen.

Ich habe mir nun dieses Video angesehen: https://www.youtube.com/watch?v=n1vS2_-Xz9o
Da wird auf dem Pi ein Webserver (der die PHP Dateien bereithält) und ein SQL Server drauf installiert. Dann wird in der SQL Datenbank via PHP Script alle Daten gespeichert.
Das würde ich auch nachmachen, aber ichbin mir nicht 100% sicher, ob der Pi dann nur in Heimnetzwerk hängt, oder ob er für jeden Pc zugänglich ist, der mein Programm installiert hat?

Und noch eine Frage zu dem Pi. Ich weiß nicht, welches Betriebssystem ich auf ihm installieren muss, damit ich genau das selbe wie im Video machen kann. Ich hätte an Raspbian gedacht, aber bin mir nicht ganz sicher.

Was meint ihr zu diesem Vorhaben?


Ralf Jansen - So 11.09.16 22:10

Zitat:
Das würde ich auch nachmachen, aber ich bin mir nicht 100% sicher, ob der Pi dann nur in Heimnetzwerk hängt, oder ob er für jeden Pc zugänglich ist, der mein Programm installiert hat?


Natürlich sind die Rechner bei dir zu Hause nicht einfach so einfach aus dem Netz zu erreichen. Wär ja der totale Security Horror wenn das einfach so wär.

a.) Die hängen garantiert hinter einer Firewall (der in deinem Router und das ist auch richtig so). Die Firewall müsstest du so einrichten das Daten auf bestimmten Ports (z.B. https) an diesen Rechner weitergeleitet werden. Wenn du in betracht ziehst die Firewall auszuschalten das ist wie seinen Türschlüssel von außen auf der Tür stecken lassen, vergiss den Gedanken. Das Netz ist böse.
b.) Einfach so ist dieser Rechner nicht dauerhaft zu finden. Du brauchst eine Domäne die auf deine IP Adresse gemappt ist und du brauchst einen DynDNS Dienst der wenn sich deine IP Adresse ändert, Home Anschlüsse haben keine garantiert fixe IP Adresse, die Registrierung nachzieht.
c.) Wenn du verschlüsselten Datenaustausch willst brauchst du auch noch ein SSL Zertifikat. Wenn das wie echte Sicherheit aussehen soll kein selbst ausgestelltes.

Zitat:
Was meint ihr zu diesem Vorhaben?


Ich hab es vermutlich schon mal irgendwo in diesem Thread gesagt, Sinn hat es nur wenn du es Lernprojekt siehst. Aus ökonomischen und sicherheitstechnischen Aspekten macht es keinen Sinn. Du musst Leute von außen in dein Netz lassen was ein Security Problem mit sich bringt und du musst dich dabei um alle Aspekte der Sicherheit selbst kümmern. Du musst das Ding am laufen halten, heißt von der Stromversorgung über Backups über Erreichbarkeit etc. Stell dich darauf ein das du viel basteln wirst. Und geh davon aus, erst recht wenn man nicht genau weiß was man tut, das das fixen von Problemen (und die werden garantiert regelmäßig auftreten) länger dauern wird. Du solltest also eine gewisse Ausfallzeit von dem Ding annehmen(Schonmal darüber nachgedacht was passiert wenn etwas passiert während du im Urlaub bist?). Wen du denn Aufwand nicht scheust und alle Beteiligten damit leben können ist das eine super Sache um zu lernen. Das ist aber auch der einzige Sinn denn das hat.


Delete - So 11.09.16 22:23

Wie wäre es mit einem Webhosting Angebot?


Csharp-programmierer - So 11.09.16 22:29

@Ralf Jansen. Hm vermutlich hast du dann doch recht

@Früchstückskaffee Da habe ich auch schonmaö dran gedacht, aber ich verstehe die Preis nicht. Bei einem Anbieter steht 2,46 im Monat. Wenn ich dieses Paket dann auswählen, steht dort auf einmal irgendwas mit 35 Euro


Blup - Mo 12.09.16 10:07

Da wir das Angebot nicht kennen, können wir dir wohl kaum Details erklären.

- einmalige Einrichtungsgebühr
- monatliche Pauschale
- Kosten für den Domännamen
- Kosten für die übertragene Datenmenge (in der Regel gibt es eine Freigrenze)

Mach dir aber erst einmal klar, welche Leistungen du vom Anbieter überhaupt erwartest.
Einen vom Anbieter administrierten PHP + MySql-Server?
Oder eine leere virtuelle Maschine in der du alles selbst installierst und administrierst?
Oder ...


Csharp-programmierer - Mo 12.09.16 14:45

Unsere Website ist ja im Moment noch kostenlos. Jetzt habe ich aber (Meiner Meinung nach) ein tolles Angebot gefunden. 80GB Webspace, 10 MySQL Datenbanken, eigene Email Adressen, FTP Zugänge für nur 3,99€ im Monat. Dann hätten wir eine eigene Domain, Datenbanken, eigene Emails, FTP Zugänge und weiteres. Was meint ihr zu diesem Angebot [Multi XL, ohne SSD] https://alfahosting.de/webhosting-professionell/?diskType=ssd?


Delete - Di 13.09.16 01:58

- Nachträglich durch die Entwickler-Ecke gelöscht -


Csharp-programmierer - Do 15.09.16 14:17

SO ich habe mir erstmal einen Testaccount angelegt. Dazu habe ich eine Datenbank angelegt und unseren PHP Programmierer beauftragt, einen Script zu schreiben. Das ist dabei rausgekommen:

PHP-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
<?php

$Server = "";
$Username = "";
$Password = "";
$Database = "";

$con = mysqli_connect($Server,$Username,$Password,$Database);
if($con)
{
$sqlquery = "SELECT * FROM TABLE";
$result = mysqli_query($sqlquery);
while($row = myssqli_fetch_ssoc($result))
{
echo $row['row name'];
}
}
?>


Nun habe ich eine Frage. Das ist ja jetzt ein Code, der alle Datensätze aus der DB rausschickt. Aber wie sieht nun die C# Anfrage aus, die eine Anfrage rausschickt und die empfangenen Daten darstellt?


Ralf Jansen - Do 15.09.16 14:34

Das ist jetzt eine Frage zu PHP, SQL und HTML/CSS. Nichts davon hat noch echten Bezug zu ADO.Net oder zu C#. Beides brauchst du nicht mehr. Fragen zu diesen gehören dann auch in die entsprechenden Forenbereiche zu diesen Themen.


Csharp-programmierer - Do 15.09.16 14:54

Aber warum? Letztendlich lade ich ja die PHP Datei auf den Server. Aber über C# muss ich ja jetzt irgendwie eine Anfrage an diesen Server senden und eventuell Daten mitgeben, damit der PHP Script dann diese Daten in die DB schreibt. Und wenn der Script Werte zurückliefert, muss die C# Anwendung diese ja empfangen und anzeigen. Das weiß ich nicht, wie man das macht. Da diese Anfrage ja über C# läuft, finde ich, bin ich jetzt noch in dem richtigen Thema:)


Ralf Jansen - Do 15.09.16 15:05

Zitat:
Aber warum?


Weil ich dich falsch verstanden habe ;) Ich dachte du wolltest irgendwie die Serverseite ändern(mit C#) um das passende zu bekommen.

Wenn du von der Clientseite steuern willst was du zurückbekommst dann mußt du einen HttpRequest an den Webserver schicken (so das der entsprechende serverseite Code aufgerufen wird z.B. dieses PHP).
Diesem Request mußt du passende Parameter mitgeben die das Serververhalten steuert, das php muß so geschrieben sein das es diese Parameter auswertet das passende anstellt und das passende in die response schreibt damit du das auf dem Client zurückbekommst.

Ziemlich ähnlich zu einem normalen Methodenaufruf in c#. Paramter übergeben, Methode macht was passendes mit den Parametern und liefert irgendwelche Daten als Return.
Die Methode ist jetzt halt nur Serverseitig und in PHP geschrieben und benutz auf dem Kanal dazwischen halt Http.


Csharp-programmierer - Do 15.09.16 19:29

Ah okay. Ich habe die PHP Datei nun auf den Server geladen und diesen per WebRequest aufgerufen. Es kommt dieser Fehler:

1


PHP-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
<?php

$Server = "https://myadmin-alfa3044.alfahosting-server.de/index.php?token=76aa4331fec5723d73a02e88b6fd70c1";
$Username = "web26282455";
$Password = "Passwortderdatenbank";
$Database = "usr_web26282455_1";

$con = mysqli_connect($Server,$Username,$Password,$Database);
if($con)
{
$sqlquery = "SELECT * FROM TABLE";
$result = mysqli_query($sqlquery);
while($row = myssqli_fetch_ssoc($result))
{
echo $row['row name'];
}
}
?>



C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
 WebRequest request = WebRequest.Create("http://test-67178.alfa3044.alfahosting-server.de/GetAllData.php");
            request.Credentials = CredentialCache.DefaultCredentials;
            HttpWebResponse response = (HttpWebResponse)request.GetResponse();
            Console.WriteLine(response.StatusDescription);
            Stream dataStream = response.GetResponseStream();
            StreamReader reader = new StreamReader(dataStream);
            string responseFromServer = reader.ReadToEnd();
            Console.WriteLine(responseFromServer);
            reader.Close();
            dataStream.Close();
            response.Close();
            Console.ReadKey();


Und hier noch, wie es im Hoster aussieht:
2


Ralf Jansen - Do 15.09.16 19:42

Jetzt bin ich mir aber sicher das du besser jemanden fragst der auch php kann. So jemanden findest du eher nicht in der ADO.Net Ecke.


Was ich ohne php Kenntnisse noch erraten kann. Dein Sql geht auf eine Tabelle mit Namen TABLE. Dein Tabelle heißt nicht TABLE.
Zu deiner mysql Datenbank verbindest du dich sicher nicht mit http. Zu dem mysql Frontend kommt du vielleicht so. An die Datenbank aber eher nicht. Servername sollte tatsächlich einfach nur der Servername sein. Wenn Datenbank und Webserver auf dem selben Rechner liegen sollte der Servername einfach 'localhost' sein.


Csharp-programmierer - Mi 21.09.16 20:26

Soo. Die Registrierung läuft nun über eine PHP Datei, die sich (vermutlich) in einem Http-Endpunkt befindet. Und diese Datei macht nun genau das, was sie soll. Also genau wir ihr schon gesagt habt. Aber nun habe ich eine Sicherheitsfrage: wenn in der HTML Datei steht <form action"registrierung.php">... könnte man sich dann nicht diese Datei irgendwie runterladen, verändern und dann wieder auf den Server laden? Ich habe nämlich noch die Frage, ob eine PHP Datei nur funktioniert, wenn Sie auf dem Server läuft oder auf einem beliebigen anderen PC auch.

In der PHP Datei stehen ja die Serverdaten und die Querys. Wenn man sich diese Datei also runterlädt und bsp. die Querys verändert (z.B. dass sie alles löscht), ist dies ja eigentlich auch unsicher, oder?


Palladin007 - Mi 21.09.16 20:46

Nein, die php-Datei bekommt niemand so ohne Weiteres zu Gesicht.
Die wird auf dem Server ausgeführt und das Ergebnis wird dann als Antwort geschickt.
Auch wenn dein Script auf einen Fehler läuft, wird danach nichts sichtbar sein, denn dann wird die Ausführung abgebrochen. Als Antwort kommt dann nur, was bis dahin noch funktioniert hat, der Rest fällt weg.

Die Frage, ob jemand die PHP-Datei herunterladen, modifizieren und wieder uploaden kann:
Klar, das geht wahrscheinlich immer, aber dann hast Du andere Sorgen. Der Angreifer hat dann sehr wahrscheinlich schon Vollzugriff und braucht die PHP-Datei nicht mehr ;)
Das sollte aber nicht so einfach möglich sein. Für sicherheitsrelevante Daten sollte sich aber auch mal jemand die Server-Konfiguration im Detail anschauen, der sich damit aus kennt. Nicht dass da irgendwo eine Lücke existiert, von der hier niemand etwas ahnen kann.


Und PHP funktioniert überall, wo PHP installiert wurde. Also Linux, Windows, Mac, etc.


Csharp-programmierer - Mi 21.09.16 20:59

Aber ich sage mal wenn man bsp dieses Formular über den Browser in den Editor holt, steht da ja bsp. registrierung.php. Von C# kenne ich bsp die Methode .DownloadData(URL). Dann könnte man sich ja einfach die Datei runterladen, oder? Sorry, aber ich möchte das wirklich sicher sein.


Palladin007 - Mi 21.09.16 21:20

Versuch es doch mal ;)
Es sollte niemand außerhalb Zugriff auf PHP-Dateien haben
Ob man das anders einstellen kann, weiß ich nicht, aber wenn das geht, stehts sicher nicht in den Standard-Einstellungen.