Har en fråga om hur man ska göra en loginapplikation. Sök på SQL-injection också när du ändå är igång. Validera ALLTID användarnamn och lösenord innan du ställer frågan. Annars kan någon annan "injicera" in egen kod där. Eller/och gör en stored procedure. Här finns massor med bra info om .net och säkerhet: Ska kolla på artiklarna senare ikväll. Återkommer om nått kruxar. Nu har jag gjort en login, som fungerar. Men vet inte hur pass bra säkerheten är osv. Skulle gärna vilja ha kommentarer på koden. Vad jag kan ändra för att förbättra osv. Oj. Nu ska jag försöka svara på dina frågar. :) Hej, Ska läsa igenom artikeln och söka lite här, kommer senare med någon kod. Magnus,Fråga om hur man gör en login
Jag har en databas där det finns ett användarnamn och ett lösenord. Jag använder den här sql-strängen för att hämta ut användarnamnet
<code>
Dim SQL As string = "SELECT * FROM anv WHERE anv = '"&anv.Text&"' AND Los = '"&los.Text&"'"
</code>
Men jag vet inte hur jag ska göra för att kontrollera om inloggningen gick rätt till.
Vet inte om det jag försöker göra är ett säkert sätt. Så frågan blir; vad finns det för sätt att göra en bra och fram för allt säker inloggning, finns det någon artikel om det? Sv: Fråga om hur man gör en login
Sen får du ju se till att endat en användare returneras, och därefter, tja.. finns nog massor på googleSv: Fråga om hur man gör en login
http://go.microsoft.com/fwlink/?LinkId=10616
Om du kollar under How To:s där så finns "How To: Use Forms Authentication with SQL Server 2000" med en bra genomgång inklusive kod. Det är tämligen enkelt att få den koden att funka med andra databaser än SQL Server 2000, så länge de stödjer parametriserade lagrade procedurer.
mvh
/JonasSv: Fråga om hur man gör en login
Sv: Fråga om hur man gör en login
<code>
Sub login_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles login.Click
'nått försök till att förhindra SQL-injections.
Dim anv, los as Object
anv = anvtext.Text
anv.Replace("'","''")
los = lostext.Text
los.Replace("'","''")
'anslut till databasen och hämta information
Dim CnStr As New OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; data source=" & Server.MapPath("admin.mdb"))
Dim cmdLogin As New OleDbCommand("SELECT Count(ID) from tbl_admin WHERE anv='"& anv &"' AND los='"& los &"'", CnStr)
CnStr.Open()
Dim int As Integer = cmdLogin.ExecuteScalar()
CnStr.Close()
cmdLogin.Dispose
'kolla om det finns nåogt innehåll
If int = 1 Then
'om loginen genomfördes lägg till den i loginstaistik
Dim Datum As DateTime = DateTime.Now
Dim cmdInsert As New OleDbCommand("INSERT INTO tbl_loginstat (Namn, Datum, IP) VALUES ('"& anv &"', '"& Datum &"', '"& Request.Servervariables("REMOTE_ADDR") &"');", CnStr)
CnStr.Open()
Dim insert = cmdInsert.ExecuteNonQuery()
Cnstr.Close()
cmdInsert.Dispose
CnStr.Dispose
Session("inloggad") = "Ja"
Session.Timeout = 45
Status.Text = "Inloggad"
Response.Redirect("default.aspx?p=inloggad")
Else
'om det inte fanns något innehåll i databasen, händer detta.
Status.Text = "Fel användarnamn eller lösenord"
Response.Redirect("default.aspx?p=start")
End If
End Sub
</code>Sv: Fråga om hur man gör en login
Ville inte men blir tvungen att ge lite kritik, men det är ju det du vill ha :-) Så jag hoppas du tar den med glädje.
Förutom att koden är rent funktionsorienterad (vilket jag inte föredrar) så har jag några funderingar.
Response.Redirect("default.aspx?p=inloggad") <--- vad kommer hända då?
Vad händer om jag skriver defaut.aspx?p=inloggad utan att ha loggat in?
Används p=inloggad för databas? i så fall kan man gära en del kul där.
Varför sätter du en session inloggad? Du har FormAuthentication som fixar allt sånt åt dig.
Om du inte läst om det så ta en titt den är rätt trevlig och underlättar en hel del arbeten.
Sedan kan du bygga om allt effektivare om du inte måste ha loggdatan i nya poster.
Behöver du lagra namn, datum och Ip för varje gång? Vill du spåra tillbaka i tiden? Eller räcker det bara att veta när du senast loggade in och med vilket ip? I så fall:
Ta bort din select och utveckal din Insert istället.
Gör så här.
Skala en tabel där du har användarnamn, lösen, senastinloggadatum, senasteip adressen.
Vad du då kan göra är en Insert av datum och ip where användarnamn och lösen är samma ta sedan en titt om någon rad påverkades, om den gjorde det så vet du att användaren finns och kan sätta han/hon som inloggad.
På detta sätt har du halverat koden. Du kan även använda dig av Parameters för att öka säkerheten och slippa köra replace med ' som i sin tur inte är direkt säkert.
Ett litet exempel på paramters med DataSet
<code>
Public Sub AddOleDbParameters()
' ...
' create myDataSet and myDataAdapter
' ...
myDataAdapter.SelectCommand.Parameters.Add("@CategoryName", OleDbType.VarChar, 80).Value = "toasters"
myDataAdapter.SelectCommand.Parameters.Add("@SerialNum", OleDbType.Integer).Value = 239
myDataAdapter.Fill(myDataSet)
</code>
Sedan undrar jag över denna:
<code>
Dim insert = cmdInsert.ExecuteNonQuery()
</code>
Varför skapa insert variabeln då du inte nyttjar den?
Mvh JohanSv: Fråga om hur man gör en login
Sessionen jag skapar har jag till att kolla om man är inloggad eller inte. Om man skulle skriva default.aspx?p=inloggad skulle man bli tillbaka skickad om man inte har sessionen. Man kan surfa på den vanliga sidan fast som admin då har man några extra funktioner, de kommer fram om man har sessionen inloggad = ja. FormAuthentication har jag kollat lite smått på. Men vad jag förstod när jag läste en artikel var att man kunde skydda hela sidor från att komma in på, men jag läste inte hur man gör för att skydda en liten del av sidan. Men artikeln var på engelska och jag är inte direkt en engelska guru, så jag kan ju ha missförstått nått. Om det går att lösa och du har något, uppskattar jag det verkligen.
Jag hade tänkt att man kan se de 25 senaste inloggningarna.
Varför jag skapade den där variablen har jag ingen aning om, får skylla på att jag var trött när jag gjorde det :)
Är inte så inne på objektionerad kod, antar att det är det du föredrar istället för funktionsorienterad, finns det någon artikel som man kan läsa mer om objektionerad. Fast eftersom jag är relativt ny på det här, kanske det får bli något mer i framtiden man ger sig på.
Jag uppskattar verkligen kritiken. Sv: Fråga om hur man gör en login
Ok.
FormAuthentication gör typ det du gör fast tidigare. När du nyttjar FormAuthentication körs ett slags ISAPI filter (inte direkt men nästan, jag kallar det så i alla fall.) Det innebär att en funktion triggas innan du ens når den ASPX sida du vill komma åt och kollar om en cokie tooken är satt om inte så är man inte inloggad och skickas till förstasidan. På detta vis behöver du inte sätta en session och inte heller fråga om sessionen är satt.
Du kan nog söka på FOrmAuthentication här och få en del svar. Du kan med lite kod i web.config strya precis vilka mappar som skall vara skyddade eller ej, samt filer. Har du en Admin mapp och vill skydda hela den så är det bara att göra det. Vill du skydda en hel applikation förutom login sidan så kan du göra det. Jag rekomenderar att du använder dig av den.
Hittade en svensk sida, har inte läst den men den verkar ta upp FormAuthentication på svenska.
http://www.aspsidan.se/kursRead.asp?kid=190
Objekt Orientering är bra att lära sig. Dock kräver det ett helt nytt tankesätt som är väldigt ovant och kan vara svårt för vissa att gå över till. Du bör absolut läsa om det, finns en del svenska böcker du kan köpa. (har du jobb be firman köpa in dem.) jag lovar du kommer älska OO och dina applikationer kommer ha en helt annat upplägg och kvalitéen kan öka markant, även utvecklingstiden minskar.
Läs gärna min krönika om Extract Method om du vill. Är rätt sunkigt skrivet men kan nog ge dig en del idéer hur du på ett bra sätt snyggar upp din kod.
Mvh JohanSv: Fråga om hur man gör en login
Går det att lösa så att en liten del av sidan är skyddad när man kör FormAuthentication? I så fall, hur?
När skolan börjar får jag gå till bibloteket och låna någon bok som tar upp ämnet OO, har du något tips på en bra bok? Sv: Fråga om hur man gör en login
Ta dig en titt på dokumentationen för de olika elementen som kan ingå i en web.config fil. Där kan du styra vilka delar av din sida som man får komma åt även om man inte är authentiserad (inloggad) och vilka man enbart får tillgång till om man är det.. man kan till och med ställa det på användarnivå om man skulle ha beghov av det