![]() |
Datenbank: ?? • Version: ?? • Zugriff über: ??
Passwortabfrage mit Datenbank abgleichen
Moin zusammen,
ich bin kompletter Neuling, was das Programmieren angeht und ich versuche mich schon seit zwei Tagen an das Problem meine Passwortabfrage am laufen zu bekommen. Jetzt habe ich es soweit am laufen, dass er die Eingabe in den Feldern Ben (Benutzername) und Code (Kennwort) mit der Datenbank abgleicht. Jedoch Vergleicht das Programm die Einträge mit der ersten Zeile in der Datenbank und wenn ich einen anderen Benutzernamen wähle, dann passiert nichts. Meine Prozedur sieht wie folgt aus:
Code:
Benutzte Objekte:
//LoginButton = true Weiterleitung zum MainForm und schließen LoginFenster
procedure TForm1.BitBtn1Click(Sender: TObject); begin if (Benutzer.text = form3.Dbf1.FieldByName('Ben').AsString) and (Code.Text = form3.Dbf1.FieldByName('Code').AsString) then begin form2.show; form1.close; end end; TLabeledEdit für Benutzername und Kennwort TBitBtn für den Login Button Für die Datenbank habe ich folgende Objekte benutzt: DGrid DBNavigator DataSource Dbf Ach ja kann man den FilePath automatisch setzten, so dass die Datenbank immer automatisch gefunden wird (anhand des TableName)? Ich hoffe meine Angaben sind ausreichend... Vielen Dank im Voraus MfG René |
AW: Passwortabfrage mit Datenbank abgleichen
Also...
Filepath und alle anderen Einstellungen kannst du zum Beispiel beim Programmstart im Event "OnFormCreate" zuweisen. Für deine Passwortabfrage brauchst du kein DBGrid und kein Navigator. Nehme eine SQL-Query Komponente und prüfe so (Pseudocode)
Code:
Dann würde ich nur mit SQLQuery.FetchedRows auf <> 0 prüfen.
SELECT *
FROM tblusers WHERE Passwort='blablabla' AND username='username' Alternativ kannst du auch in der Query
Code:
Die Anzahl der gefunden Übereinstimmungen berechnen und mittels FieldByName('RecFound').AsInteger <> 0 prüfen.
SELECT count(id) As RecFound
FROM tblusers WHERE .... Schau dir mal die Einsteiger-Tutorials zu SQL und den DB-Komponenten an. |
AW: Passwortabfrage mit Datenbank abgleichen
Erstmal Danke für deine schnelle Antwort.
Irgendwie kann ich damit nichts anfangen... Ich habe versucht dein Beispiel einzubinden, jedoch klappt das nicht... Ich nutze auch keine SQL Datenbank ich vermute mal das es damit zusammenhängt. Wenn ich ein SQLQuery einbinde dann kann ich dieses Objekt nicht mit meiner Datenbank verbinden. ... Zitat:
Und noch eine Anmerkung, die ich vergessen habe... Ich nutze kein Delphi sondern Lazarus, aber ich habe mir sagen lassen, dass zwischen Lazarus und Delphi kein Unterschied besteht außer die Kosten halt :lol: Danke René |
AW: Passwortabfrage mit Datenbank abgleichen
Da mir nicht klar ist, was für eine Datenbank Du nutzt, versuch es mal so in der Form (nur hingedaddelt und nicht getestet):
Delphi-Quellcode:
//LoginButton = true Weiterleitung zum MainForm und schließen LoginFenster
procedure TForm1.BitBtn1Click(Sender: TObject); begin dbf1.Filtered := false; dbf1.Filter := Format('Ben = %s and Code = %s',[QuotedStr(Benutzer.text),QuotedStr(Code.Text)]); dbf1.Filtered := true; dbf1.First; if not dbf1.EoF then begin form2.show; form1.close; end; dbf1.Filtered := false; end; |
AW: Passwortabfrage mit Datenbank abgleichen
Tausend Dank...:thumb:
Zitat:
MfG René |
AW: Passwortabfrage mit Datenbank abgleichen
Zunächst mal:
Normalerweise meldet man sich an der DB mit User/PW an. Dein Verfahren, auf einer geöffneten DB nach passenden Usern zu suchen erinnert eher an Mittelschicht Anwendungen, klassische Webserver, wie passt das zu einem Fatclient? Für den Fall, dass dbf tatsächlich dbf ist und die "Datenbank" einfach so im Zugriff liegt, wofür brauchst Du Nutzer und Passwort, wenn sowieso jeder die "Datenbank" öffnen kann? Die Filtered Sache: Das Attribut gibt den Zustand an, bzw. ändert ihn bei Zuweisung. Der Filter(text) selbst ist natürlich nur wirksam, wenn Filtered True ist. Einen aktiven Filter ändert man nicht. Man schaltet auch den Motor aus, bevor man die Zündkerzem wechselt (und dann erst wieder an) Ach und wie soll ein System anhand eines Tabellennamen wissen, wo die zugehörige DB liegt ohne in die DB reinzuschauen? Das geht nur wenn Du es definierst. TABA liegt auf C:\meinedb.dbf, TABB lieft auf c:\backup\meinedb.dbf usw. Alternativ kannst Du nach DBF suchen und darin nach dem gewünschten Tabellennamen schauen. |
AW: Passwortabfrage mit Datenbank abgleichen
Zitat:
Was passierte denn, wenn das erste Ausschalten entfällt, aber bereits ein Filter gesetzt ist? Wird der Filter dann bereits bei der Zuweisung der "Filtertextes" entsprechend verändert? Oder ist das Einschalten dann erforderlich? Lässt sich ein veränderter Filter einschalten, wenn bereits ein anderer Filter eingeschaltet ist? Was ist im DBGrid zu sehen, wenn ein Filter eingeschaltet ist? Kann man dann noch per Navigator durch die Daten scrollen? @Jobo: Ich hab' auch eine "Datenbank", in der ich Benutzernamen und Passwörter für die verschiedenen "Systeme", auf die ich so im Laufe der Zeit zugreifen muss, verwalte. Wenn ich halt mal wieder eine Anmeldung vergessen habe, so brauche ich nur Benutzername und Passwort der Anwendung, mit der ich die Benutzernamen und Passwörter verwalte und kann dann dort nachschauen, welchen Benutzernamen und welches Passwort ich gerade benötige. Prinzipiell könnte es sich hier also schon um eine sinnvolle Anwendung halten. Andererseits könnte man auf diese Weise aber auch eine Zugriffsverwaltung (mit Berechtigungskonzept) ähnlich verwalten. Die Anwendung meldet sich an der Datenbank an, aber diese Anmeldung ist unabhängig davon, ob der Nutzer der Anwendung dann auch über die Anwendung Zugriff auf die Datenbank bekommt. Wenn ich mich hier im Forum anmelde, dann muss ja auch "irgendwer" in 'ner Datenbank nachschauen, ob ich zugriffsberechtigt bin und wenn ja, mit welchen Rechten. Aber Benutzername und Passwort, für die hinter dem Forum liegenden Datenbank, sind mir vollkommen unbekannt. Und bei der Registrierung im Forum wird garantiert kein Benutzer (mit meinen Anmeldedaten) in der Datenbank anlegt. |
AW: Passwortabfrage mit Datenbank abgleichen
@nahpets
Dein Vergleich mit dem Forum ist das was @jobo mit Mittelschicht meinte. ;) |
AW: Passwortabfrage mit Datenbank abgleichen
Zitat:
Die Anwendung hier könnte quasi die Grundlage liefern, damit die Mittelschicht die Möglichkeit bekommt, Benutzernamen und Passwörter abzugleichen. Die Mittelschicht muss nicht unbedingt selbst eine Option enthalten, mit deren Hilfe sie sich quasi selbst verwaltet. Hier dürfte es sich eher um eine Verwaltung für Benutzernamen und Passwörter handeln, die halt zufällig die Daten in irgendeiner Tabelle irgendeiner Datenbank speichert. Aber eigentlich egal: Die Informationslage ist wohl nicht aussagekräftig genug, um hier auf eine konkrete Anwendung schließen zu können ;-) |
AW: Passwortabfrage mit Datenbank abgleichen
Zitat:
Ja, so meinte ich das. Es kann natürlich sein, dass der TE eine Passwortverwaltung schreibt. Da kann man sich immer noch fragen, ob es Sinn macht in der Form. Ich vermute eher, dass gemäß Selbstauskunft des TE hier noch einige Verständnisschwierigkeiten bestehen. Aber das kann er ja selbst fragen. |
AW: Passwortabfrage mit Datenbank abgleichen
Moin...:P
[mein Senf am Rande] ... man speichert keine Passwörter im Klartext in der Datenbank sondern nur dessen Hash z.B. Damit geht auch kein Klartext über die Leitung. :wink: [/mein Senf am Rande] |
AW: Passwortabfrage mit Datenbank abgleichen
Wie kann ich den Ein Passwort als Hash speichern? Und meinst Du mit "über die Leitung" das Internet bzw, Netzwerk? Weil Das Programm soll lediglich lokal auf einer Maschine verwendet werden.
Zitat:
MfG René |
AW: Passwortabfrage mit Datenbank abgleichen
Zitat:
Es ist eine Grundregel: vertraue keiner Webseite (oder Anwendung), die dein Passwort im Klartext speichert. Firmen, die es dennoch tun, werden zum Beispiel unter ![]() |
AW: Passwortabfrage mit Datenbank abgleichen
Liste der Anhänge anzeigen (Anzahl: 1)
Moin...8-)
Zitat:
Zitat:
Delphi-Quellcode:
Beim Speichern des neuen Paßwortes erzeugst du auch den MD5, setzt die Paßwortvariable auf '' und speicherst den MD5 ab. Mit obiger Methode hast du im Programm keinen Vergleich der Paßwörter. Dieser läuft quasi schon in der Datenbank. Wenn du im Programm vergleichen willst dann nur die Hashes.
procedure TLogin.Login(aUserName, aPassword: string); // aPassword = Klartext direkt ohne Umwege aus dem Eingabeedit
var MD5Password: string; // Hash begin MD5Password := MD5DigestToStr(MD5String(aPassword)); aPassword := ''; // Pseudocode: // Query... frage die Datenbank ob es einen Benutzer(aUserName) mit dem MD5Passwort gibt. // !!! Werte immer als Parameter der Query mitgeben. // Hat die Query eine Antwort (Resultmenge = 1) ist der Benutzer gültig // fertsch... // Mach was mit dem User end; PS: Das ist eine einfache Variante aber ausreichend. Sicherer geht es immer... :wink: |
AW: Passwortabfrage mit Datenbank abgleichen
Erstmal möchte ich mich für deine Hilfe bedanken... und selbstverständlich auch bei allen anderen, denen ich noch nicht geantwortet habe... Aber leider hatte ich heute dafür keine Zeit, da ich den ganzen Tag auf einen blöden BOS Lehrgang bin. ...
Zitat:
Aber eine Frage noch vorweg, muss das LoginFenster in der der Unit DelphiMD5 eingebaut werden oder wird die "procedure TLogin.Login..." in meiner eigentlichen Login Unit (in meinem Fall die Unit 1) mit dem Befehl "uses DelphiMD5;" automatisch abgearbeitet? MfG und einen schönen rest Samstag René PS: Bitte denkt daran, ich bin erst seit ca. einer Woche mit dem Programmieren am Gange und zuvor hatte ich keinerlei Erfahrungen bzw. Kenntnisse im Bereich der Programmierung. Das einzige was ich bisher gemacht habe, ist die Homepage unseres Ortsvereins... |
AW: Passwortabfrage mit Datenbank abgleichen
Wenn von deiner Seite die entsprechende Initiative zurückkommt helfen wir gern...:thumb:
Zitat:
![]() |
AW: Passwortabfrage mit Datenbank abgleichen
Zitat:
MfG René |
AW: Passwortabfrage mit Datenbank abgleichen
Das Buch ist auch in Ordnung. Du solltest ein Verständnis für diverse Begrifflichkeiten und deren Verwendung haben. (Variablen, Konstanten, Prozeduren, Funktionen, Klasse, Instanz etc.)
Der Rest ist Übungssache und viel probieren. :thumb: |
AW: Passwortabfrage mit Datenbank abgleichen
Moin... :P
Dann schaun wir mal... Zitat:
Mit dem entsprechenden Vorwissen hättest du an meinem Beispielcode gesehen das mein Login eine Klasse ist. Für den Anfang geht das natürlich auch ohne. Du spendierst deinem Form eine private procedure namens Login oder ähnlich :wink:. In dieser Procedure bringst du dann die Logik, entsprechend dem Beispiel, unter. Hinweis: Wenn du mit Query statt Table arbeitest mußt du dich auch zwangsläufig mit SQL und Parametern beschäftigen. Das kann je nach verwendeten Komponenten eingeschränkt sein. Wie du siehst ist das nicht mal eben programmiert wenn das Basiswissen fehlt. Programmieren ist ein ständiger Lernprozess bei dem man klein anfangen und sich ständig weiterentwickeln muß. Um die Motivation nicht zu verlieren braucht man auch Erfolgserlebnisse. Die kannst du aber knicken wenn du deine Ziele zu hoch ansetzt. Dann lieber Step by Step... :thumb: Hänge mal deinen kompletten Code hier an. Da sehen wir mal wo es Nachholebedarf gibt. :zwinker: |
AW: Passwortabfrage mit Datenbank abgleichen
Erstmal Danke... Ich habe versuch deinen Code einzubinden, aber dann kommen lauter Fehlermeldungen:
Projekt kompilieren, Ziel: DRK: Exit code 256, Fehler: 1 DelphiMD5.pas(17,6) Fatal: Kann Windows nicht finden verwendet von DelphiMD5 des Projektinspektors. Projekt kompilieren, Ziel: DRK: Exit code 256, Fehler: 20, Hinweise: 5 DelphiMD5.pas(234,30) Error: Operator is not overloaded: "TUINT4Array" and "Byte" DelphiMD5.pas(235,33) Error: Operator is not overloaded: "TUINT4Array" shr "ShortInt" DelphiMD5.pas(236,33) Error: Operator is not overloaded: "TUINT4Array" shr "ShortInt" DelphiMD5.pas(237,33) Error: Operator is not overloaded: "TUINT4Array" shr "ShortInt" DelphiMD5.pas(258,16) Error: Illegal type conversion: "TByteArray" to "LongWord" DelphiMD5.pas(258,36) Error: Illegal type conversion: "TByteArray" to "LongWord" DelphiMD5.pas(259,5) Error: Illegal type conversion: "TByteArray" to "LongWord" DelphiMD5.pas(259,36) Error: Illegal type conversion: "TByteArray" to "LongWord" DelphiMD5.pas(288,10) Error: Incompatible types: got "TArray4UINT4" expected "LongWord" DelphiMD5.pas(288,23) Error: Incompatible types: got "TArray4UINT4" expected "LongWord" DelphiMD5.pas(288,36) Error: Incompatible types: got "TArray4UINT4" expected "LongWord" DelphiMD5.pas(288,49) Error: Incompatible types: got "TArray4UINT4" expected "LongWord" DelphiMD5.pas(360,2) Error: Operator is not overloaded: inc "TArray4UINT4" DelphiMD5.pas(360,2) Error: Incompatible types: got "untyped" expected "TArray4UINT4" DelphiMD5.pas(361,2) Error: Operator is not overloaded: inc "TArray4UINT4" DelphiMD5.pas(361,2) Error: Incompatible types: got "untyped" expected "TArray4UINT4" DelphiMD5.pas(362,2) Error: Operator is not overloaded: inc "TArray4UINT4" DelphiMD5.pas(362,2) Error: Incompatible types: got "untyped" expected "TArray4UINT4" DelphiMD5.pas(363,2) Error: Operator is not overloaded: inc "TArray4UINT4" DelphiMD5.pas(363,2) Error: Incompatible types: got "untyped" expected "TArray4UINT4" DelphiMD5.pas(461,17) Hint: Local variable "Context" does not seem to be initialized DelphiMD5.pas(468,33) Hint: Local variable "Buffer" does not seem to be initialized DelphiMD5.pas(475,17) Hint: Function result variable does not seem to be initialized DelphiMD5.pas(482,17) Hint: Local variable "Context" does not seem to be initialized DelphiMD5.pas(484,17) Hint: Function result variable does not seem to be initialized Ach ja ich hatte in einen Post zuvor erwähnt, dass ich Lazarus verwende und nicht Delphi, für den Fall, dass dies noch nicht bekannt sein sollte und dies den Fehler verursachen sollte. Zudem Schreibe ich das Programm primär unter Linux und anschließend kompiliere ich es noch unter Mac und Windows 10. ...:pale: Zitat:
Code:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, sqldb, db, FileUtil, Forms, Controls, Graphics, Dialogs, ComCtrls, ExtCtrls, StdCtrls, Buttons, Menus; type { TForm1 } TForm1 = class(TForm) BitBtn1: TBitBtn; BitBtn2: TBitBtn; CheckBox1: TCheckBox; Image1: TImage; Benutzer: TLabeledEdit; Code: TLabeledEdit; MainMenu1: TMainMenu; MenuItem1: TMenuItem; MenuItem2: TMenuItem; StatusBar1: TStatusBar; Timer1: TTimer; procedure BitBtn1Click(Sender: TObject); procedure BitBtn2Click(Sender: TObject); procedure CheckBox1Change(Sender: TObject); procedure CodeChange(Sender: TObject); procedure CodeKeyPress(Sender: TObject; var Key: char); procedure MenuItem2Click(Sender: TObject); procedure MenuItem4Click(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation uses Unit2, Unit3, Unit4; {$R *.lfm} { TForm1 } //Anzeige DATUM und Uhrzeit in der Statusleiste procedure TForm1.Timer1Timer(Sender: TObject); var hr, min, sec, msec: Word; begin DecodeTime(now, hr, min, sec, msec); StatusBar1.Panels[1].Text := FormatDateTime ('dd.mm.yyyy, hh:nn:ss', Now); Form2.StatusBar2.Panels[1].Text := FormatDateTime ('dd.mm.yyyy, hh:nn:ss', Now); Form3.StatusBar1.Panels[1].Text := FormatDateTime ('dd.mm.yyyy, hh:nn:ss', Now); Form4.StatusBar1.Panels[1].Text := FormatDateTime ('dd.mm.yyyy, hh:nn:ss', Now); end; //Abbruch des Logins und schlie√üen des Programms procedure TForm1.BitBtn2Click(Sender: TObject); begin form2.close; end; // Passworteingabe durch Sternchen ersetzten procedure TForm1.CodeChange(Sender: TObject); begin Code.PasswordChar := '*'; end; //Passworteingabe durch Sternchen deaktivieren procedure TForm1.CheckBox1Change(Sender: TObject); begin if CheckBox1.Checked then begin Code.PasswordChar := #0; end else begin Code.PasswordChar := '*'; end end; //Mit Enter den LoginButton aktivieren procedure TForm1.CodeKeyPress(Sender: TObject; var Key: Char); begin if Key = #13 then begin BitBtn1.Click; // or something else Key := #0; end; end; //LoginButton = true Weiterleitung zum MainForm und schlie√üen LoginFenster procedure TForm1.BitBtn1Click(Sender: TObject); begin form3.dbf1.Filtered := false; form3.dbf1.Filter := Format('Ben = %s and Code = %s',[QuotedStr(Benutzer.text),QuotedStr(Code.Text)]); form3.dbf1.Filtered := true; form3.dbf1.First; if not form3.dbf1.EoF then begin form2.show; form1.close; end; form3.dbf1.Filtered := false; end; //Beenden des Programms durch das Mainmenü procedure TForm1.MenuItem2Click(Sender: TObject); begin form2.close; end; procedure TForm1.MenuItem4Click(Sender: TObject); begin form3.showmodal; end; end. Nochmals vielen Dank für die umfangreiche Hilfe, das ist nicht selbstverständlich und vor allem wird es in vielen Foren immer seltener... Gruß René |
AW: Passwortabfrage mit Datenbank abgleichen
Nur noch was Grundsätzliches zu "Passwörtern".
Zitat:
|
AW: Passwortabfrage mit Datenbank abgleichen
Seit
![]() |
AW: Passwortabfrage mit Datenbank abgleichen
Hatte mir noch nicht alles durchgelesen ... mit einigen Strg+F fand ich auf die schnelle nichts, was sich darum handelte. :oops:
Gelesen hatte ich bis dahin, dass es vielleicht besser sei sich bei der DB anzumelden und es nicht selber zu bauen, oder so. :angle2: |
AW: Passwortabfrage mit Datenbank abgleichen
@himitsu
never mind - du hast auf jeden Fall einen sehr wichtigen Aspekt noch hinzugefügt: Salted Hash |
AW: Passwortabfrage mit Datenbank abgleichen
:wink: Jungs... ich hatte ja geschrieben... "Sicherer geht es immer". Wir reden hier maximal über eine Vereinsverwaltung eines Programmieranfängers und nicht die NASA... :P Er ist schon verwirrt genug. :zwinker:
|
AW: Passwortabfrage mit Datenbank abgleichen
Zitat:
|
AW: Passwortabfrage mit Datenbank abgleichen
Moin... :P
...mit Lazarus kann ich dir nicht weiterhelfen. :? Das Prinzip dürfte soweit klar sein. Gehe auf die Suche nach einer MD5 Bibliothek für Lazarus. Dann probierst du es damit. :thumb: PS: Die MD5 Unit kompliliert unter Delphi ohne Warnungen. Daran sieht man das es nicht paßt. :? |
AW: Passwortabfrage mit Datenbank abgleichen
Wenn er schon sucht, sollte er aber nach einer mit einem besseren Hashverfahren (SHA-256 oder Spezial Hash-Funktionen für Passwörter) suchen. Microsoft sperrt jetzt schon Zertifikate mit SHA1 (dem "Nachfolger" von MD5).
![]() ![]() |
AW: Passwortabfrage mit Datenbank abgleichen
Ich danke euch... Ich werde mir das morgen mal in aller Ruhe anschauen und hoffentlich werde ich dann ein bisschen schlauer. :-D
MfG René |
AW: Passwortabfrage mit Datenbank abgleichen
:thumb:...jeden Tag ein wenig mehr.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:32 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz