Du må være registrert og logget inn for å kunne legge ut innlegg på freak.no
X
LOGG INN
... eller du kan registrere deg nå
Dette nettstedet er avhengig av annonseinntekter for å holde driften og videre utvikling igang. Vi liker ikke reklame heller, men alternativene er ikke mange. Vær snill å vurder å slå av annonseblokkering, eller å abonnere på en reklamefri utgave av nettstedet.
  15 1002
Hei! Har et relativt avansert prosjekt på gang ut i fra mine kunnskaper, men står nå fast på siste problem (som forøvrig er første del av programmet :P ). Jeg skal lage en login-skjerm, som skal sjekke passord og brukernavn ut fra to skjulte listboxer... Har googlet mye, men alle andre med lignende problemer bruker Access, og det blir helt annerledes enn hva jeg trenger... Noen som har noen sider å anbefale, evt. input å komme med? Her er det jeg har så langt, jeg har fått til brukernavn-sjekken(?) men vet ikke hvor jeg skal gå videre fra det...

Kode

Dim brukernavn, passord As String
    Private Sub btnLoggInn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoggInn.Click
        brukernavn = txtNavn.Text
        passord = txtPassord.Text
        If lstBrukere.Items.Contains(brukernavn) Then
        Else : MsgBox("Wrong username.")
        End If
Login-skjermen skal forøvrig lede videre til et annet form, men dette har jeg kontroll på hvordan jeg gjør.
Du er klar over at sikkerheten i dette prosjektet = 0 sant? Selv om listboxen er skjult, er den NULL problem å hente ut dette i klartekst.

Bruk heller database, med en kryptert hash for passord.

Slik at databasen blir noe lignende:

-------------------------------------------------
|UsernamePassword Hash (MD5): |
-------------------------------------------------
|lroedal |24e592de8b20fe09938916d79b08854e|
-------------------------------------------------

Passordet er i realiteten "passord123", men for at dette skal være sikkert, skal verken databasen eller softwaren din noensinne vite dette.

I dette tiflellet brukte jeg en MD5 hash på passordet og fikk: "24e592de8b20fe09938916d79b08854e".

Det du gjør i koden da, blir noe slikt som dette:

passord = md5(txtPassord.Text)
Dim database_pass as string
database_pass= database.user=lroedal get password.

If passord = database_pass then
msgbox("OK")
else
msgbox("Wrong username or password").
end if


Nå er det viktige å vite at dette ikke er reell VB kode, men du skjønner tankegangen. Google deg fram til de forskjellige funksjonene for reell kode
Hvorfor bruker du en skjult listboks for å lagre passordene? Høres ut som en fryktelig sær måte å lagre disse på.
Hvis du først skal gjøre det enkelt, hvorfor hardkoder du dem ikke inn i kildekoden?
Sitat av petterpan2 Vis innlegg
Hvorfor bruker du en skjult listboks for å lagre passordene? Høres ut som en fryktelig sær måte å lagre disse på.
Hvis du først skal gjøre det enkelt, hvorfor hardkoder du dem ikke inn i kildekoden?
Vis hele sitatet...
Sikkerheten blir i så fall like dårlig. En måte å gjøre det på, om det MÅ være i applikasjonene, er å ha en obfuscated hash, men dette er ikke å anbefale. Om dette programmet plutselig må ha en ny bruker, må en lage en ny versjon av programmet også. Mye smartere å bruke database. Eller, til og med en klartekst fil med passord og brukernavn, så lenge passordene er hashet.
Du kan fint gjøre dette med en SQLite-database. Da slipper du å sette opp en databaseserver etc.

*Her er forøvrig en enkel variant i C#:

http://jbhammon.com/index.php?option...sharp&Itemid=4

Kode

Dim brukernavn, passord As String
    Private Sub btnLoggInn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoggInn.Click
        brukernavn = txtNavn.Text
        passord = txtPassord.Text
        If lstBrukere.Items.Contains(brukernavn) Then
            If lstPassord.Items.Contains(passord) Then
                   MsgBox("Hurra")
            Else : MsgBox("Feil passord")
        Else : MsgBox("Wrong username.")
        End If
Kan alltids gjøre det sånn.. Har bare fortsatt på koden din, men absolutt ikke sånn jeg ville gjort det selv. Aller helst skal du bruke en database og kryptering som nevnt over
Sitat av djxfade Vis innlegg
Sikkerheten blir i så fall like dårlig. En måte å gjøre det på, om det MÅ være i applikasjonene, er å ha en obfuscated hash, men dette er ikke å anbefale. Om dette programmet plutselig må ha en ny bruker, må en lage en ny versjon av programmet også. Mye smartere å bruke database. Eller, til og med en klartekst fil med passord og brukernavn, så lenge passordene er hashet.
Vis hele sitatet...
Noe sikkerhet blir det jo uansett ikke av dette, bare syntes de listboksene virket som en særdeles rar måte å lagre programdata på

Blir jo ganske komplisert å benytte en database bare for å lagre noen passord, er vel mest fornuftig å kryptere dem og lagre dem i app.config

Sitat av kapsen Vis innlegg

Kode

Dim brukernavn, passord As String
    Private Sub btnLoggInn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoggInn.Click
        brukernavn = txtNavn.Text
        passord = txtPassord.Text
        If lstBrukere.Items.Contains(brukernavn) Then
            If lstPassord.Items.Contains(passord) Then
                   MsgBox("Hurra")
            Else : MsgBox("Feil passord")
        Else : MsgBox("Wrong username.")
        End If
Kan alltids gjøre det sånn.. Har bare fortsatt på koden din, men absolutt ikke sånn jeg ville gjort det selv. Aller helst skal du bruke en database og kryptering som nevnt over
Vis hele sitatet...
Hvorfor skal man bruke en database til slikt? Det er jo virkelig å skyte spurv med kanoner. Legg heller dette i app.config.
Er en oppgave med visse parametere, derfor jeg er nødt å benytte meg av listbox... Koden der er i nærheten av det jeg tenkte på selv, men problemet er at slik den står vil den godta alle passord i listboxen uavhengig av brukernavnet...

Jeg er nødt å skrive inn en sjekk i tillegg, som sjekker at indexen til passordet (f.eks plass 5) er det samme som indexen til det valgte brukernavnet. Brukernavnene og passordene må nemlig ligge med samme index i de to listboxene. Litt kjedelig å sitte fast på dette, da alt annet er ferdig...
Lurer på hva slags oppgave dette er? For om dette skal være en "sikkerhets" funksjon, kan den like så godt bare droppes. For denne måten gir deg null sikkerhet.

Eneste "sikre" måten å gjøre dette på, er som sagt ved hashing av passord. Om du bruker en flatfile, eller en database spiller forøvrig ikke så stor rolle. Så lenge du i koden din hasher passord textboxen, og bare sjekker hashen opp i mot hashen i database/flatfile, så har programmet aldri røpt passordet (om du skjønner?).

Ved bruk av database er det også mye lettere å ha brukernavn og passord knyttet sammen.
Sitat av lroedal Vis innlegg
Er en oppgave med visse parametere, derfor jeg er nødt å benytte meg av listbox... Koden der er i nærheten av det jeg tenkte på selv, men problemet er at slik den står vil den godta alle passord i listboxen uavhengig av brukernavnet...

Jeg er nødt å skrive inn en sjekk i tillegg, som sjekker at indexen til passordet (f.eks plass 5) er det samme som indexen til det valgte brukernavnet. Brukernavnene og passordene må nemlig ligge med samme index i de to listboxene. Litt kjedelig å sitte fast på dette, da alt annet er ferdig...
Vis hele sitatet...
Hva slags oppgave er dette? Den høres eksepsjonelt klønete ut..
Kan legge ut oppgavetekst, mitt design og koden når jeg kommer hjem fra jobb.
Det som gjør dette ekstra klønete er at du må lagre passordene i listbokser, item lista deres implementerer ikke IQueryable og du får dermed en kjempestygg kode for å sjekke om brukernavn stemmer overens med passord.

Hvis oppgaven krever at du skal lagre dette i listboks, kan man da slippe unna med å lagre alt i EN listboks? du kan jo f.eks bruke formatet "brukernavn.passord", da kan du skrive
If lstBrukereOgPassord.Items.Contains(brukernavn + "." passord)
Sist endret av petterpan2; 7. oktober 2011 kl. 14:05.
Hm, kanskje det kunne vært noe? Er meningen at man skal bruke to, men regner med jeg kan bruke en om jeg eventuelt argumenterer for det... Skal sjekke det alternativet når jeg kommer hjem også!
Om dette er ment å være en skoleoppgave, er jeg mildt sagt sjokkert over hvor lite de tenker på sikkerhet. Denne login metoden her kan knekkes på under 5 min...

Kode

Public Class Form1

    Dim brukernavn, passord As String
    Private Sub btnLoggInn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoggInn.Click
        brukernavn = txtNavn.Text
        passord = txtPassord.Text
        If lstBrukere.Items.Contains(brukernavn) Then
        Else : MsgBox("Wrong username.")
        End If

    End Sub
    Public Function Sjekkpassord(ByVal passord As String) As String

    End Function
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Form2.Show()

    End Sub
End Class

Kode

Public Class Form2

    Private Sub btnReverser_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnReverser.Click
        Dim reverser As String
        reverser = txtOrd.Text
        txtOrd.Text = erOrd(reverser) 'Her benyttes funksjonen erOrd for å reversere stringen i txtord.text, og sende den tilbake til samme tekstboks
    End Sub
    Function erOrd(ByVal str As String) As String
        If str Is String.Empty Then 'Dersom ingen ord er skrevet inn vil det "erstattes" med en blank string.
            Return String.Empty
        End If

        If str.Trim().Length() = 0 Then
            Return str
        End If

        Dim chars As Char() = str.ToCharArray() 'Her gjøres stringen om til et array
        Array.Reverse(chars) 'Her reverseres arrayet
        Return New String(chars) 'Her retuneres arrayet som en string
    End Function

    Private Sub btnBlank_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnBlank.Click
        lstOrdliste.Items.Clear() 'Dette fjerner all info i ordlisten.
    End Sub

    Private Sub btnRegAvslutt_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegAvslutt.Click
        If MsgBox("Vil du avslutte, og returnere til login?", MsgBoxStyle.YesNo) =
            DialogResult.Yes Then
            Me.Hide() 'Dette gjemmer registreringsskjemaet
            Form1.Show() 'Dette henter frem login-skjemaet igjen

        End If
    End Sub

    Private Sub btnRegistrer_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegistrer.Click
        Dim x As Integer = -1, ord As String
        ord = txtOrd.Text 'Greide desverre ikke å skrive funksjonen erOrd slik at den også kunne sjekke stringen... Så måtte gjøre det slik for at det skulle fungere.
        x = lstOrdliste.FindString(txtOrd.Text) ' Her byttes verdien av x ut dersom et ord eksisterer i lstboxen.
            If x > -1 Then
            MsgBox("Ord eksisterer allerede, på linje " & x.ToString)
        Else
            lstOrdliste.Items.Add(ord)
            End If
    End Sub
End Class
Her er koden jeg har så langt...

Designet ligger her, sammen med oppgaveteksten.
http://i53.photobucket.com/albums/g76/lroedal/prog1.png

http://i53.photobucket.com/albums/g76/lroedal/prog2.png

Pga. stor størrelse linker jeg til dem heller enn å embedde dem...

Men, i registreringsdelen av oppgaven (del2) brukte jeg kode for å hente ut index til ord for å vise hvor de ligger... Kunne jeg ikke brukt denne koden og lagret to integer (en for passord og en for brukernavn), for å sammenlignet disse? Om brukernavn/passord stemmer som forslaget over, kan jeg ikke da sjekke disse to integerene mot hverandre? Om de stemmer, så kjører jeg login derfra..
Sist endret av lroedal; 7. oktober 2011 kl. 20:28.
Kan du ikke legge det hele i et array??

Også "source" arrayet fra en Listbox??
derretter sammenlikner passord utfra brukernavn.

Har ikke noe IDE som støtter VB på min maskin, så vet ikke om følgende fungerer som forventet

Kode

Dim loginarray(1, 1) As String
loginarray(0, 0) = "Bruker1"
loginarray(0, 1) = "Pasord1234"
loginarray(1, 0) = "Bruker2"
loginarray(1, 1) = "Passord4321"

Dim logindata = (Enumerable.Range(0, loginarray.GetLength(0)).Select(Function(i) New With { _
    .username = loginarray(i, 0), _
    .password = loginarray(i, 1)}) _
    ).toarray

ListBox1.DisplayMember = "username"
ListBox1.ValueMember = "passord"
ListBox1.DataSource = logindata