Login erstellen wie(Visual Basic)?
Hallo, ich würde gerne eine ganz simple Loginseite erstellen. Ich weiß auch wie das geht, nur ich würde es gern so haben das wenn jemand sich mein Programm Downloadet, sich Registrieren will, und er ein Benutzername(Email) und ein Passwort festlegt, es gespeichert wird. Sodass er sich nicht jedes mal neu Registrieren muss. Also es soll wenn er sich Registriert hat seine Daten auf meinem PC gespeichert werden. Sodass ich eine Kontrolle über die Registrierten Accounts habe. In kurzer Form: Fremde Person downloadet sich mein Programm, Muss sich ein Account erstellen (Registrieren), legt ein Benutzernamen und ein Passwort fest, sobald er dann auf Registrieren klickt, werden die Anmeldedaten ( Benutzername und Passwort) an meinem PC gesendet. Wie es an meinem PC ankommt ist mir egal Hauptsache ich habe irgendwie einen Überblick :3 vielen dank im Voraus :)
1 Antwort
Du benötigst einen zentralen Server, zu dem die Anwendung des Nutzer Kontakt aufnimmt (Server-Client-Verbindung).
Auf dem Server sollte eine Datenbank stationiert werden, in der die Nutzerdaten gesichert werden. Zusätzlich sollte dort eine Serveranwendung liegen, die Anfragen der Clients handhabt, und Daten aus der Datenbank holt / in die Datenbank importiert. Sie muss nicht zwingend auf VB basieren.
Eine einfache Variante wäre es also, sich einen Webspace mit MySQL-DB bspw. zu beschaffen und dann die Kommunikation via HTTPS vorzunehmen. Achte in der Hinsicht darauf, dass der Webserver die Sprache unterstützt, die du nutzen möchtest. Ein IIS-Webserver bspw. könnte ASP.NET-Anwendungen (geschrieben in VB.NET) handhaben.
Ja, das würde vollkommen ausreichen.
Wenn du phpMyAdmin allerdings über localhost aufrufst, hast du den Server doch gerade bei dir lokal laufen. Das dient doch sicherlich erst einmal nur zu Testzwecken, oder soll dein Rechner da später auch als Server fungieren (der Tag und Nacht an ist)?
Das Passwort solltest du nicht in Klartext speichern, sondern berechnen lassen. Das heißt, wenn sich ein neuer Nutzer registriert, wird das Passwort mit einem individuellen Salt gehashed und dieses Ergebnis gespeichert. Wenn sich der Nutzer einloggen möchte, wird zu seinem Passwort der gleiche Hash berechnet und mit dem in der Datenbank verglichen. Nutze einen Algorithmus wie AES für die Verschlüsselung, den Salt solltest du übrigens ebenso noch in der Tabelle speichern.
Ich hab es jetzt geschafft das es über localhost läuft. wenn ich einen namen mit Passwort angebe wird es in einer Tabelle mit php ausgespuckt :D jetzt allerdings will ich es als Server fungieren lassen. Ich habe mir einen Server bei lima-City geholt und eine neue Datenbank (mysql) in lima-City erstellt. nur ich kann sie nicht in Visual Studio einbinden..
Ist das notwendig? Bis auf die Verbindungsdaten ändert sich dein PHP-Skript doch nicht.
Da du nun schon so weit bist und ich es oben noch nicht geschrieben hatte: Bau es dir wie eine API auf. Die VB-Anwendung führt bspw. einen Request auf https://yourdomain/?hash=somehash aus (oder sendet den Hash nicht via URL sondern im Request Body) und die PHP-Anwendung nimmt nun die Daten entgegen, macht möglicherweise vorläufige Checks und sucht dann in der Datenbank. Das Ergebnis würde ich mir im JSON-Format zurückgeben lassen (so etwas wie:
{ success: true }
Das lässt sich in der Regel recht gut verarbeiten. Oder du setzt den HTTP Status je nach Antwort (auf 200 / 403 / ...).
Hier ist mal mein Script (für die Localhost variante) : Imports MySql
Imports MySql.Data
Imports MySql.Data.MySqlClient
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
End Sub
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim con As New MySqlConnection
Dim cmd As New MySqlCommand
Dim reader As MySqlDataReader
con.ConnectionString = "Data Source=localhost;database=xanaxboost;UID=root;pwd="
cmd.Connection = con
cmd.CommandText = "INSERT INTO `users` (`id`,`benutzername`,`passwort`) VALUES (NULL,'" & TextBox1.Text & "','" & TextBox2.Text & "')"
con.Open()
reader = cmd.ExecuteReader()
reader.Close()
con.Close()
Form2.Show()
End Sub
Wenn ich jetzt nur die con.ConnectionString = "Data Source=localhost;database=xanaxboost;UID=root;pwd=" Daten änder gibt es ein problem mit: con.Open() es wird folgendes angezeigt: MySql.Data.MySqlClient.MySqlException: "Unable to connect to any of the specified MySQL hosts."
Die VB-Anwendung ist in deinem Fall die Client-Anwendung. Diese kommuniziert aber nicht direkt mit der Datenbank. Das wäre auch ein Sicherheitsrisiko. Stell dir vor, jemand deiner Nutzer nimmt einmal die Anwendung auseinander und liest die DB-Credentials ein, die zwingend in der Anwendung stehen müssten.
Dein VB-Anwendung schickt stattdessen HTTPS Requests an deine PHP-Webanwendung und die antwortet auf die Anfragen.
Also sowas in der Art?
using System;
using System.IO;
using System.Net;
using System.Text;
namespace Examples.System.Net
{
public class WebRequestGetExample
{
public static void Main ()
{
// Create a request for the URL.
WebRequest request = WebRequest.Create ("http://www.contoso.com/default.html");
// If required by the server, set the credentials.
request.Credentials = CredentialCache.DefaultCredentials;
// Get the response.
HttpWebResponse response = (HttpWebResponse)request.GetResponse ();
// Display the status.
Console.WriteLine (response.StatusDescription);
// Get the stream containing content returned by the server.
Stream dataStream = response.GetResponseStream ();
// Open the stream using a StreamReader for easy access.
StreamReader reader = new StreamReader (dataStream);
// Read the content.
string responseFromServer = reader.ReadToEnd ();
// Display the content.
Console.WriteLine (responseFromServer);
// Cleanup the streams and the response.
reader.Close ();
dataStream.Close ();
response.Close ();
}
}
}
Das stimmt, macht es dir aber dennoch einfacher.
Ich kann dir mal ein kurzes Beispiel (nicht getestet) geben:
Dim responseText As String
Try
Dim request As HttpWebRequest
Dim requestUri Ashttp://yourdomain/?hash=somehashehashehash")
request = DirectCast(HttpWebRequest.Create(requestUri), HttpWebRequest)
If (request.GetResponse().ContentLength > 0) Then
Dim reader As New StreamReader(request.GetResponse().GetResponseStream())
responseText = Response.Write(reader.ReadToEnd())
reader.Close();
End If
Catch ex As WebException
responseText = ""
End Try
Und das PHP (http://yourdomain/index.php?hash=somehash):
<?php
if (empty($_GET["hash"]) {
return;
}
$hash = $_GET["hash"];
// connect to db and send sql request with prepared statements ...
print $result;
In der VB-Variable responseText wird dann das Ergebnis stehen, welches PHP auf die Seite geschrieben hat.
Bezüglich Prepared Statements findest du hier noch ein einfaches Beispiel - entweder für PDO oder für MySQLi. Welche dieser beiden Varianten du wählst, sollte einerlei sein.
Ah, wie nett - GF hat mir mal wieder im Code herumgepfuscht. In Zeile 5 sollte ein Uri-Objekt erstellt werden.
Dim requestUri As New Uri("your url")
Alles ab dem Fragezeichen in der URL ist der Querystring. Dieser besteht aus Wertepaaren, die über die URL transportiert werden. So hat dieser Querystring bspw.:
?firstname=hans&lastname=mueller&age=27
Daten für eine Person. Jedes Wertepaar wird via & getrennt, die Trennung zwischen Key und Value erfolgt mit dem Gleichheitszeichen. In PHP ist es daraufhin möglich, über das superglobale Array $_GET auf diese Daten zuzugreifen. Dafür wird der Key genutzt:
$name = $_GET["firstname"] . " " . $_GET["lastname"]; // hans mueller
$age = $_GET["age"];
Wenn die Daten im Request Body mitgeschickt werden würden, müsstest du sie mittels $_POST-Array erfragen.
Dim requestUri As New Uri("your url") Muss bei Your url meine Url zu meiner Datenbank rein? also in meinem fall: Dim requestUri As New Uri("https://pma.lima-city.de/sql.php?server=1&db=db_394543_1&table=users&pos=0")
Den Teil habe ich ohne Probleme geschafft:
Dim responseText As String
Try
Dim request As HttpWebRequest
Dim requestUri As New Uri("your url")
request = DirectCast(HttpWebRequest.Create(requestUri), HttpWebRequest)
If (request.GetResponse().ContentLength > 0) Then
Dim reader As New StreamReader(request.GetResponse().GetResponseStream())
responseText = Response.Write(reader.ReadToEnd())
reader.Close();
End If
Catch ex As WebException
responseText = ""
End Try
Nur jetzt komme ich leider nicht weiter!
Naja, wenn du einen Login schreibst, sollte dieser auch sicher sein, die Daten also verschlüsseln und sorgfältig behandeln, andernfalls ist er unnütz.
Da du doch aber mit .NET arbeitest, findet sich einiges schon vorimplementiert wieder. Schau hier für eine AES-Verschlüsselung.
Was du nun machen solltest:
- Wenn sich ein Nutzer neu registriert, einen Salt generieren (eine Random-Zeichenfolge)
- Mitsamt Salt und vom Nutzer eingegebenes Passwort eine verschlüsselte Zeichenfolge, wie du sie erhältst, wenn du die oben verlinkte Lösung wählst, generieren.
- Diese Zeichenfolge, den Nutzernamen und den Salt jeweils in der DB speichern.
- Bei Login: Mit Nutzernamen Salt und verschlüsselten Wert aus DB lesen und das vom Nutzer eingegebene Passwort verschlüsseln (wie in Punkt 2). Danach die Verschlüsselung mit der Zeichenfolge der DB vergleichen.
Nein. Nochmals: Die Datenbank wird von deiner VB.NET-Anwendung nicht direkt angesprochen, weil das zu unsicher ist. Die Client-Anwendung übersendet weder Verbindungsdaten für die Datenbank noch irgendwelche anderen sensitiven Daten, die nicht verschlüsselt sind.
Die VB.NET-Anwendung ruft im Prinzip eine Webseite auf. Dabei übermittelt sie Informationen, die von der Webanwendung (PHP-Skript), die die Webseite generiert, genutzt werden können, um Nachforschungen anstellen zu können. Das PHP-Skript verbindet sich also mit der Datenbank und schaut nach, ob ein passender Eintrag gefunden werden kann. Dementsprechend gibt sie irgendeinen Text als Ergebnis zurück. Dieses Ergebnis kann durch die VB.NET-Verbindung via StreamReader gelesen werden.
Du kannst ja mal zwischenzeitlich testen, ob das schon funktioniert. Leg eine index.php-Datei auf dem Lima-Webspace ab, mit dem Inhalt:
<?php
print "hello world";
Passe die Adresse für das Uri-Objekt (in VB) an, ergänze eine Konsolenausgabe für responseText und starte einmal deine Anwendung.
@regex9 hey ich hab mein Programm fertig gestellt. jetzt möchte ich es veröffentlichen... nur ich möchte nicht das jeder mein "Script" sieht von Visual Studio... wie kann ich das Verschlüsseln? Also das Code wo man z.B sieht was auf dem Button gesetzt wurde etc. z.B MsgBox("Beispiel")
Okay ich habe mich mal kurz reingefuchst und habe mir soeben eine erstellt. Wenn ich jetzt im Browser eingebe localhost/phpMyAdmin komme ich auf eine Seite dort kann ich eine Datenbank anlegen. Kannst du mir da vllt. weiterhelfen was ich da jetzt genau machen muss? oder eventuell das ein oder andere Tutorial schicken? lg. Toni
Okay vielen dank, ich werde mir direkt mal ein Webspace mit MySQL-DB erstellen :D
Also kann ich einfach eine Datenbank als Tabelle anlegen wo, ich dann 2Felder auswähle mit folgenden Reitern: benutzername und Passwort?