Avatar billede soren567 Nybegynder
23. juli 2002 - 10:44 Der er 20 kommentarer og
3 løsninger

Hvordan kan man lave nedenstående password login sikre ???

Jeg kunne godt tenke mig at vide hvordan man kan lave det her sikre, problemet er at når der er nogen der har logget ind 1. gang så kan de nogle gange resikere at komme ind på den forkerte konto ?!! jeg går udfra det har noget med sessions at gøre ??

her kommer koden :

<%
If Request.Form("Action") = "Login" Then
    strWmId = Trim(Replace(Request.Form("Username"),"'",""))
    strPWD = Trim(Replace(Request.Form("Password"),"'",""))

    If Len(strWmId) > 0 And Len(strPWD) > 0 Then
%>
<!--#include file="ConnectDb.inc"-->
<%
strSQL = "SELECT * FROM Merchant"&_
" WHERE (Username = '" & strWmId & "')"&_
" AND (Password = '" & strPWD & "')"
Set rs = Conn.Execute(strSQL)
 
  If Not Rs.EOF Then
    Session("Id") = Rs("Id")
    Session("FullName") = Rs("FullName")
    Session("login") = "True"
    Response.Redirect "AccWeb.asp"
  Else
    Error = "<b><font color='#CE6B31'>Invalid Username or Password !</font></b>"
  End If
End If
End If
%>

Håber på nogle gode svar !!
Avatar billede puppetmaster Nybegynder
23. juli 2002 - 10:48 #1
Hmmmm....det er faktisk nøjagtig samme måde jeg selv gør det på, men har aldrig haft nogle problemer med det, så jeg følger lige "slagets gang" her fra sidelinien...
Avatar billede Jman Praktikant
23. juli 2002 - 11:05 #2
Prøv at slutte af med

Session.Abandon
inden %>
Avatar billede eagleeye Praktikant
23. juli 2002 - 11:05 #3
Du har husket den oplagte fejl som mange laver.. at ændre ' til enten '' eller tom.

Hvis du ikke vil havde folk forsøger at polle din side som tjekker brugernavn/password, så kan du på den side form'en ligger på sætte en Session og tjekke session er sat inden du tjekker for brugernavn og password... Hvis jeg nu laver et program som står og poster en form til din side vil jeg måske en gang være heldig og ramme rigtigt, det kan du så sikre ved at du sætter en Session varialbe på form siden.

<form>
<input type=text name=brugernavn>
...
<% Session("login") = "formside" %>

Så kan du udvide din if sættning:

If (Request.Form("Action") = "Login") AND Session("login") = "formside" Then

Ligeleds kan du tjekke om det er den rigtig fil som postede form'en, med Requiest.ServerVarables("HTTP_REFERER"), der får du både servernavn + foler + sti, så det er let at tjekke om det passer:

if Requiest.ServerVarables("HTTP_REFERER") = "http://www.xxx.dk/login/loginform.asp" then

Men det er vist mest hardcore hacker som begynder at selv sende form til login tjekkeren for at finde et brugernavn og password. Husk Session er ikke 100% sikker men det er det bedste vi har...
Avatar billede Slettet bruger
23. juli 2002 - 11:09 #4
Well.. nok et dum spørgsmål, men er di sikker på du ikke har to brugere med samme brugernavn og/eller pass!?

Jeg ville personligt aldrig lave:

strSQL = "SELECT * FROM Merchant WHERE (Username = '" & strWmId & "') AND (Password = '" & strPWD & "')"

På denne måde godkender du brugeren hvis der blot findes noget i databasen (og dette kan så omgåes ved at indtaste noget, der modificerer din SQL-sætning, så der altid vil findes noget).

Jeg kan ikke huske linket, men dette er blevet diskuteret her på eksperten.

JEg ville søge efter brugernavnet i databasen:

strSQL = "SELECT * FROM Merchant WHERE (Username = '" & strWmId & "')"

og så ville jeg derefter spørge om password er korrekt:

If Rs.EOF
'Der blev ikke fundet nogen bruger
Else
If Rs("Password") = strPWD Then
  'Brugeren godkendt (log ham ind)
Else
  'Password forkert
End If
End If

Hvis dette ikke løser det, vil jeg meget gerne se den kode, du bruger for at beskytte, de asp-sider, der beskyttet med password.
Avatar billede tmceu Praktikant
23. juli 2002 - 11:09 #5
Jeg kan ikke se hvordan sessioner skulle have noget med dette at gøre. Sessioner bliver ikke genbrugt (så længe serveren ikke genstartes), så en bruger kan ikke overtage en anden brugers session.

Du må forklare hvad du mener med, at de kommer ind på en forkert konto...
Avatar billede eagleeye Praktikant
23. juli 2002 - 11:09 #6
Du kan ændre denne til ikke bare at tjekke om der noget i recordsetet:

If Not Rs.EOF Then

Til at tjekke at brugernavn og password er det samme som man indtastede, hvis der er nogle som kender til andre uheldigheder i SQL..

If Not Rs.EOF Then
  if LCase(rs("Username")) = LCase(strWmId) AND LCase(rs("Password")) = LCase(strPWD) then
    Session("Id") = Rs("Id")
    Session("FullName") = Rs("FullName")
    Session("login") = "True"
    Response.Redirect "AccWeb.asp"
  end if
end if
'Dette behøves ikke være i Else dele for hvis man kommer hertil er der forkert brugernavn eller password
Error = "<b><font color='#CE6B31'>Invalid Username or Password !</font></b>"
Avatar billede neteffect Nybegynder
23. juli 2002 - 11:11 #7
Jeg synes også det ser ganske fornuftigt ud. Måske skulle du lige rs.close før du redirecter. Og hvis invalid username/password, så blank session-variablerne ud igen.
Avatar billede tmceu Praktikant
23. juli 2002 - 11:16 #8
Det er efterhånden blevet en tradition at jeg siger dette :-)

Hvis du beslutter dig for at følge eagleeye's gode råd om anvendelse af Request.ServerVarables("HTTP_REFERER"), skal du forholde dig til hvad du vil gøre, hvis denne information er blank.

Flere og flere (ikke mindst ADSL kunder) benytter en firewall som ZoneAlarm eller Norman Personal Firewall. Mange af disse er standard konfigureret til at skjule referer siden, for at beskytte brugeren. Det betyder at du sandsynligvis vil opleve at et sted mellem nogle og mange af dine brugere ikke vil understøtte denne.

Du skal derfor beslutte dig for om disse tilfælde skal ignoreres eller de i så fald ikke kan benytte din side.
Avatar billede soren567 Nybegynder
23. juli 2002 - 11:20 #9
Okay, svarene ser rigtige ud, men for en sikerheds skyld forklarer jeg lige hvordan man opdagede fejlen.

Man oprettede en konto med brugernavn og password.
herefter gik man væk fra webstedet og kom tilbage igen og oprettede en nu konto. så loggede man ind med det 1 konto navn og kom ind på en 3 mands konto (3 mands konto skulle han aldrig have haft adgang til) !!! meget besynderligt, for når jeg tester internt på systemet, så kan jeg aldrig få den fejl !!
Avatar billede Slettet bruger
23. juli 2002 - 11:27 #10
Igen: jeg ville gerne se den kode, du bruger til at beskytte dine sider med...
Avatar billede soren567 Nybegynder
23. juli 2002 - 11:29 #11
Den kode stump kommer her :

<%
If Session("Login") ="" Then
    Response.Redirect("LogWeb.asp")
End If
%>
Avatar billede tmceu Praktikant
23. juli 2002 - 11:31 #12
Som det tidligere er indikeret, lyder det som om at der er flere brugere med samme brugernavn i databasen. Brugernavn bør være unik i databasen og dette bør håndteres af en constraint i databasen (primary key el. index).
Avatar billede Slettet bruger
23. juli 2002 - 11:57 #13
Ja det eneste jeg kan se, er, at den forkerte bruger findes i databasen.

Prøv at ændre din kode. Det det første og eneste man skal se, efter godkendt login er brugerID og evt. brugernavn på den konto, der lige er blevet logget ind....

Prøv så igen at "simulere" den situation, hvor fejlen opstår (hvis muligt), og se om du kan bruge dette til at "fange" fejlen.

Jeg har med sucess brugt lign. metoder som i mit tidligere svar, til at logge brugere ind, så hvis du har prøvet at bruge en af de metoder, som er forelået af os i dette spm., så tror ikke det er i denne kode/fil, problemet ligger.
Avatar billede soren567 Nybegynder
23. juli 2002 - 12:00 #14
Er der ikke en der gider at skrive det eksagte/hele kode som jeg skal bruge og som i mener er den sikreste udfra det der er skrevet her, så jeg kan copy/paste det og få det testet ??
Avatar billede soren567 Nybegynder
23. juli 2002 - 12:02 #15
og hvis følgende kan gøre bedre må i også meget gerne lave det om til precis det jeg skal copy/paste :

<%
If Session("Login") ="" Then
    Response.Redirect("LogWeb.asp")
End If
%>
Avatar billede Slettet bruger
23. juli 2002 - 12:12 #16
<%
If Request.Form("Action") = "Login" Then
    strWmId = Trim(Replace(Request.Form("Username"),"'",""))
    strPWD = Trim(Replace(Request.Form("Password"),"'",""))

    If Len(strWmId) > 0 And Len(strPWD) > 0 Then
%>
<!--#include file="ConnectDb.inc"-->
<%
strSQL = "SELECT * FROM Merchant WHERE (Username = '" & strWmId & "'
Set rs = Conn.Execute(strSQL)
 
  If Rs.EOF
    Error = "<b><font color='#CE6B31'>Invalid Username!<font></b>"
  Else
    If Rs("Password") = strPWD Then
      Session("Id") = Rs("Id")
      Session("FullName") = Rs("FullName")
      Session("login") = "True"
      Response.Redirect "AccWeb.asp"
    Else
      Error = "<b><font color='#CE6B31'>Invalid Password !
    End If
  End If
%>
Avatar billede puppetmaster Nybegynder
23. juli 2002 - 12:14 #17
Nu er det en forholdsvis lille database jeg selv har, så jeg bruger session-variable til at holde styr på brugerne vha.

<%
  If Session("DitSessionID") <> Session.SessionID Then
    Response.Redirect "loginform.asp"
  End If
%>

Når brugeren logger på, tildeles de et SessionID og hvis dette ID ikke matcher det "løbende" SessionID, smides de til login side. Samme gør sig gældende, hvis de logger af.....så bliver deres Session afsluttet.

<%
  Session.abandon
  Response.Redirect "loginform.asp"
%>
Avatar billede Slettet bruger
23. juli 2002 - 12:14 #18
Lige en kommentar: du kunne sagtens selv have skrevet denne kode ud fra dette spm.
Avatar billede eagleeye Praktikant
23. juli 2002 - 12:22 #19
smajli... jeg vil klart fra råde at udskrive om det er password eller brugrnavnet den er gal med, det gør det ti gange lette at komme ind..
Avatar billede puppetmaster Nybegynder
23. juli 2002 - 12:25 #20
Yeah, eagleeye, det er bedre bare at skrive "Invalid username or password!", så kan brugeren selv gætte på hvilket af dem der er forkert...(en løsning jeg selv sværger til)
Avatar billede eagleeye Praktikant
23. juli 2002 - 12:26 #21
Jeg ville lave det sådan her, husk LCase på dine if sætnigner som tjekker strenge da "Pass" ikke er det samme som "pass"... Hvis du har Access så er den ikke case senativ så den den er ligeglad mad Case..:


<%
If Request.Form("Action") = "Login" Then
    strWmId = Trim(Replace(Request.Form("Username"),"'",""))
    strPWD = Trim(Replace(Request.Form("Password"),"'",""))

    If Len(strWmId) > 0 And Len(strPWD) > 0 Then
%>
<!--#include file="ConnectDb.inc"-->
<%
strSQL = "SELECT * FROM Merchant"&_
" WHERE (Username = '" & strWmId & "')"&_
" AND (Password = '" & strPWD & "')"
Set rs = Conn.Execute(strSQL)
 
  If Not Rs.EOF Then
    If LCase(rs("Username")) = LCase(strWmId) AND LCase(rs("Password")) = LCase(strPWD) then
      Session("Id") = Rs("Id")
      Session("FullName") = Rs("FullName")
      Session("login") = "True"
      Response.Redirect "AccWeb.asp"
    End IF
  End If
  Error = "<b><font color='#CE6B31'>Invalid Username or Password !</font></b>"
End If
End If
%>
Avatar billede puppetmaster Nybegynder
23. juli 2002 - 12:39 #22
Men jeg skal stadigvæk loope gennem recordset'et før det lukkes... :(
Avatar billede puppetmaster Nybegynder
23. juli 2002 - 12:40 #23
Hov, forkerte vindue jeg postede i! :(
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester