Toon posts:

[ASP] Inlogsysteem

Pagina: 1
Acties:
  • 120 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
ik heb dus het probleem dat als ik op de vorige pagina username & paswoord submit naar deze pagina dat het laden superlang duurt en uiteindelijk komt er een error...wat is hier dan het probleem..?

ps don't shoot me maar ik ben nog niet zo lang bezig met ASP

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<%
dim boodschap
dim cnn 
dim rec
set cnn = server.createobject("adodb.connection")
set rec = server.createobject("adodb.recordset")
cnn.open "provider=microsoft.jet.oledb.4.0;data source=" & server.mappath("artemis2000.mdb")
rec.open "tbllogin", cnn, 3, 3
rec.movefirst
do while rec.eof = false
if rec("naam") = request.form("naam") then
    if rec("paswoord") = request.form("paswoord") then
    boodschap = "u bent ingelogd"
    else
    boodschap = "u heeft het verkeerde paswoord ingegeven"
    end if
    else
    rec.movenext
end if
loop
response.write boodschap
rec.close
set rec = nothing
cnn.close
set cnn = nothing
%>

  • Terence(x)
  • Registratie: September 2002
  • Laatst online: 18-08 11:24
Ik heb zelf nooit iets in asp gedaan maar kan je niet beter eerst een search query doen naar de username ipv alle records te doorlopen in een loop (das je trage laden)

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Kan je misschien foutmelding ietsie preciezer definieren.. ASP kan nogal veel foutmeldingen uitspugen..

En je hebt imho het meest onlogische inlogsysteem dat ik ooit heb gezien.. Waarom wil je alle users ophalen, en niet een simpele selectquery uitvoeren icm met een Where-clausule?

[ Voor 47% gewijzigd door gorgi_19 op 27-03-2003 22:07 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 22:38
Verwijderd schreef op 27 maart 2003 @ 22:01:
ik heb dus het probleem dat als ik op de vorige pagina username & paswoord submit naar deze pagina dat het laden superlang duurt en uiteindelijk komt er een error...wat is hier dan het probleem..?

ps don't shoot me maar ik ben nog niet zo lang bezig met ASP
Kan veel makkelijker:

Iets van :


rec = cnn.execute ("Select paswoord from tbllogin where naam='" & request("naam") & "'"
if rec("paswoord") = request("paswoord") then
boodschap = "u bent ingelogd"
else
boodschap = "u heeft het verkeerde paswoord ingegeven"
end if

[ Voor 11% gewijzigd door StevenK op 27-03-2003 22:12 ]

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Waarom zet je beide requests niet in dezelfde SQL statement? En waarom controleer je je userinput niet?

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • StevenK
  • Registratie: Februari 2001
  • Laatst online: 22:38
gorgi_19 schreef op 27 March 2003 @ 22:13:
Waarom zet je beide requests niet in dezelfde SQL statement? En waarom controleer je je userinput niet?
Dan weet je niet of de username of 't wachtwoord fout was.

Was advocaat maar vindt het juridische nog steeds leuk. Doet tegenwoordig iets in de metaal.


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

StevenK schreef op 27 maart 2003 @ 22:17:
[...]

Dan weet je niet of de username of 't wachtwoord fout was.
maakt je dat bij inloggen wat uit? liever niet, maakt het inloggen juist moeilijker...
anders is het veel eenvoudiger te kraken.

[ Voor 9% gewijzigd door gorgi_19 op 27-03-2003 22:23 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
sorry maar ik zei al dat ik nog niet zo lang met ASP bezig ben (slechts enkele weken) maar ik heb het ondertussen met een SQL statement geprobeerd en dat lukt inderdaad..maar het moet (volgens m'n leerkracht) ook zonder SQL kunnen...

oplossing;
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%
dim boodschap
dim cnn 
dim rec
set cnn = server.createobject("adodb.connection")
set rec = server.createobject("adodb.recordset")
cnn.open "provider=microsoft.jet.oledb.4.0;data source=" & server.mappath("artemis2000.mdb")
rec.open "select * from tbllogin where naam='" & request.form("naam") & "'", cnn, 3, 3
if rec("paswoord") = request.form("paswoord") then
response.write "u bent ingelogd"
else
response.write "u heeft het verkeerde paswoord ingegeven"
end if
rec.close
set rec = nothing
cnn.close
set cnn = nothing
%>

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

* gorgi_19 vindt het geen oplossing.. Mijn inlognaam is gorgi's
. Betekent einde applicatie voor je. Of mijn inlognaam is:
' Or 1=1 or naam='a

Of ik heb 10000 inlognamen in mijn db staan.. en dan afvragen waarom het soms wat trager gaat

vergeet iig niet om een aantal tutorials doore te nemen, anders kom je jezelf heel snel tegen.

[ Voor 53% gewijzigd door gorgi_19 op 27-03-2003 22:28 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


Verwijderd

Topicstarter
het zijn gebruikersnamen die in de database zitten...
voorlopig moeten die nog niet aangemaakt worden want die namen zitten al standaard in de database
*nog eens: ik ben nog een leek in ASP ffs, ik ben al blij dat dit werkt

  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 27 maart 2003 @ 22:30:
het zijn gebruikersnamen die in de database zitten...
voorlopig moeten die nog niet aangemaakt worden want die namen zitten al standaard in de database
*nog eens: ik ben nog een leek in ASP ffs, ik ben al blij dat dit werkt
Het enige wat ik zeg is: Verklaar deze oplossing niet heilig. Dat dit nu werkt is mooi meegenomen. :) Maar houdt hier niet per definitie aan vast. :)

Daarbij komt nog dat dit een discussieforum is. Meerdere mensen lezen dit topic mee, een beetje verdere 'verdieping' is niet verkeerd. :) Mocht iemand later dit topic teruglezen, dan ziet hij ook gelijk de minpunten van jouw methodiek. :)

[ Voor 21% gewijzigd door gorgi_19 op 27-03-2003 22:35 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
Verwijderd schreef op 27 March 2003 @ 22:24:
.maar het moet (volgens m'n leerkracht) ook zonder SQL kunnen...


Waarom? Wat is er mis met SQL ?

Waarom haal je de userinfo niet direct uit de databank?
Ik bedoel, waarom maak je ook geen gebruik van het wachtwoord in de SQL string?

zo:
code:
1
2
3
4
SELECT *
FROM tblUsers
WHERE tblUsers.UserName = username
AND tblUsers.Password = EncryptedPwd


Dan haal je direct het goede record op, en als er een verkeerde username of pwd ingegeven werd, wordt er niets opgehaald.

Je maakt ook het best gebruik van parameters in je SQL statement ipv je SQL statment dynamisch op te bouwen door de waardes waarop je zoekt te concateneren. Zo kan je SQL injection attacks beter voorkomen.

[ Voor 58% gewijzigd door whoami op 27-03-2003 23:12 ]

https://fgheysels.github.io/


Verwijderd

ASP:
1
2
3
4
5
6
7
8
SqlString = "SELECT * FROM UserIndexTable WHERE lcase(Username) = lcase('" & Username & "')"

IF NOT rs.EOF THEN
 DO While NOT rs.EOF
 IF rs("Password") = Password THEN Login = "Successful"
 IF rs("Password") <>Password THEN Login = "Failed"
 Loop
END IF

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
Verwijderd schreef op 27 maart 2003 @ 23:18:
ASP:
1
2
3
4
5
6
7
8
SqlString = "SELECT * FROM UserIndexTable WHERE lcase(Username) = lcase('" & Username & "')"

IF NOT rs.EOF THEN
 DO While NOT rs.EOF
 IF rs("Password") = Password THEN Login = "Successful"
 IF rs("Password") <>Password THEN Login = "Failed"
 Loop
END IF


Dit code voorbeeld hebben we al eens gehad, er is al (opbouwende) kritiek op geuit en je zegt niet hoe of waarom je het zo doet.
Voegt dus niet veel toe aan het topic, vind je niet?

https://fgheysels.github.io/


Verwijderd

whoami schreef op 27 March 2003 @ 23:24:

[...]


Dit code voorbeeld hebben we al eens gehad, er is al (opbouwende) kritiek op geuit en je zegt niet hoe of waarom je het zo doet.
Voegt dus niet veel toe aan het topic, vind je niet?
Ik weet ook niet wat hier allemaal al eens langs is gekomen, ik weet alleen dat SQL in deze situatie helemaal geen verkeerde oplossing is. In een dergelijke code zoals door mij hier boven beschreven kun je ook eenvoudig dingen toevoegen zoals IF Blocked = 1 THEN Login = 0.. je snapt me wel :)

Even over die opmerking van jou: "Voegt dus niet veel toe aan het topic, vind je niet?"

ik vind dat mijn post toch wel wat meer toegevoegde waarde levert aan dit topic dan jouw (in mijn ogen flamerige) opmerking. Het is oom te beginnen ontopic.

En als mijn code brak zou zijn, dan vertrouw ik erop dat de mede tweakers dat onderbouwd zullen mededelen aan ons :) denk je niet?

  • shades
  • Registratie: September 2001
  • Laatst online: 10-08 15:01

shades

huh ?

Verwijderd schreef op 27 maart 2003 @ 23:18:
ASP:
1
2
3
4
5
6
7
8
SqlString = "SELECT * FROM UserIndexTable WHERE lcase(Username) = lcase('" & Username & "')"

IF NOT rs.EOF THEN
 DO While NOT rs.EOF
 IF rs("Password") = Password THEN Login = "Successful"
 IF rs("Password") <>Password THEN Login = "Failed"
 Loop
END IF
Je gaat er hier dus vanuit dat er dezeflde namen kunnen voorkomen :? Normaal is rs.RecordCount = 1 bij dit soort dingen.

If doe het meestal zo:

ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Option Explicit

Function CheckCredentials()
  CheckCredentials = False
  
  ' form controle
  Dim strPassword
  Dim strAccount

  strAccount = LCase(Request.Form("naam"))
  strPassword = Request.Form("paswoord)

  If strAccount = "" Then Exit Function

  ' verder met db gedoe
  Dim strQuery
  Dim objRS
  
  strQuery = "SELECT naam, paswoord " & _
             "FROM   tblLogin " & _
             "WHERE  naam='" & strAccount & "' " & _ 
               "AND  paswoord='" & strPassword & "'
  Server.CreateObject("ADODB.Recordset")
  objRS.Open strQuery, strConnection, adOpenDynamic, adLockReadOnly, adCmdText
  If objRS.Recordset = 1 Then CheckCredentials = True
  objRS.Close
  Set objRS = Nothing
End Function


Je kan er ook een Sub van maken, of de naam en password als parameter meegeven aan de function maar, vergt dan wel wat aanpassingen.

Hoe dat zit met dat voorbeeld van StevenK met die execute (met je waarschijnlijk een ADODB.Command voor nodig) weet ik niet precies wat ik heb het op die manier nooit gebruikt. Weet ook niet precies wat de voordelen ervan zijn.

Is wel ff uit losse pols dus misschien tikfoutjes hier en daar.

Nog even een linkje: http://www.asp101.com/samples/login.asp

[ Voor 20% gewijzigd door shades op 27-03-2003 23:49 ]

https://k1600gt.nl


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 20-08 11:40

gorgi_19

Kruimeltjes zijn weer op :9

Verwijderd schreef op 27 maart 2003 @ 23:34:
[...]
En als mijn code brak zou zijn, dan vertrouw ik erop dat de mede tweakers dat onderbouwd zullen mededelen aan ons :) denk je niet?
Daarom zou het ook fijn zijn als je een kleine toelichting aan je code gaf. Normaal gesproken heb ik iig geen zin in een lap code te doorlopen om te controleren of het goed is of niet, zonder enige vorm van uitleg er bij en alleen een lap code als post.

En dat je code brak is, heb ik al aangegeven in [rml]gorgi_19 in "[ ASP] Inlogsysteem"[/rml], want min of meer dezelfde kritiek is hier ook op jou van toepassing.

Ik vraag me trouwens in het algemeen af waarom niemand het belang ziet van het controleren op bepaalde tekens... Ik gok dan ook dat als mensen overstappen op SQL server, men verbaasd is dat hun applicatie zwaar vernaggeld wordt; ze hadden immers toch een 'goede' beveiliging. Krijgen we hier topics van: "Ik ben gehacked! Help!

In het 'beste' geval is er met de tot nu toe genoemde codes alleen nog maar oneigenlijke toegang tot de applicatie te verschaffen.

[ Voor 49% gewijzigd door gorgi_19 op 28-03-2003 08:26 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

whoami schreef op 27 March 2003 @ 23:10:
Waarom haal je de userinfo niet direct uit de databank?
Ik bedoel, waarom maak je ook geen gebruik van het wachtwoord in de SQL string?

zo:
code:
1
2
3
4
SELECT *
FROM tblUsers
WHERE tblUsers.UserName = username
AND tblUsers.Password = EncryptedPwd


Dan haal je direct het goede record op, en als er een verkeerde username of pwd ingegeven werd, wordt er niets opgehaald.
Let op dat het password in de quey opnemen soms juist gevoeliger voor SQL injection is.
Als je de userinput goed valideert en voorbewerkt dan is er niets aan de hand, maar vaak vind je ook een oplossing als deze:
code:
1
2
3
4
SELECT *
FROM tblUsers
WHERE tblUsers.UserName = username
AND tblUsers.Password = md5(password)

Dit biedt de mogelijkheid om SQL injection op het password te doen, wat een stuk meer mogelijkheden biedt dan op de username, in de praktijk kun je je dan als iedere bekende user aanmelden.
Een betere oplossing is dan de md5 over het password heenhalen voor de query.

De oplossing waarbij je het password ophaalt in de query en vergelijkt in de applicatiecode heeft als voordeel dat SQL injection op het password ook niet gaat.

Maar uiteindelijk is bij al deze oplossingen maar een ding echtbelangrijk: valideer je userinput!
Je maakt ook het best gebruik van parameters in je SQL statement ipv je SQL statment dynamisch op te bouwen door de waardes waarop je zoekt te concateneren. Zo kan je SQL injection attacks beter voorkomen.
Dat is sowieso een betere oplossing die ik de laatste tijd helaas wel steeds minder voor zie komen, vooral in de webtaaltjes.

Who is John Galt?


  • DukeMan
  • Registratie: Mei 2000
  • Niet online
Verwijderd schreef op 27 March 2003 @ 22:01:
ik heb dus het probleem dat als ik op de vorige pagina username & paswoord submit naar deze pagina dat het laden superlang duurt en uiteindelijk komt er een error...wat is hier dan het probleem..?

ps don't shoot me maar ik ben nog niet zo lang bezig met ASP

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<%
dim boodschap
dim cnn 
dim rec
set cnn = server.createobject("adodb.connection")
set rec = server.createobject("adodb.recordset")
cnn.open "provider=microsoft.jet.oledb.4.0;data source=" & server.mappath("artemis2000.mdb")
rec.open "tbllogin", cnn, 3, 3
rec.movefirst
do while rec.eof = false
if rec("naam") = request.form("naam") then
    if rec("paswoord") = request.form("paswoord") then
    boodschap = "u bent ingelogd"
    else
    boodschap = "u heeft het verkeerde paswoord ingegeven"
    end if
    else
    rec.movenext
end if
loop
response.write boodschap
rec.close
set rec = nothing
cnn.close
set cnn = nothing
%>
Niet echt meer van toepassing, maar toch wil ik even aangeven wat er fout zit in je code:

Je doet hetr volgende:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
...
do while rec.eof = false
    if rec("naam") = request.form("naam") then
        if rec("paswoord") = request.form("paswoord") then
            boodschap = "u bent ingelogd"
        else
            boodschap = "u heeft het verkeerde paswoord ingegeven"
        end if
    else
        rec.movenext
    end if
loop
...


Zoals je ziet... als je rec("naam") = request.form("naam") is dan zal hij nooit een movenext doen op je database, maar hij blijft wel in de loop zitten (do while rec.eof = false)

Hierdoor zal je dus na enkele tijd een time out krijgen...

Beter is het volgende:
code:
1
2
3
4
5
6
7
8
9
10
11
12
...
do while rec.eof = false
    if rec("naam") = request.form("naam") then
        if rec("paswoord") = request.form("paswoord") then
            boodschap = "u bent ingelogd"
        else
            boodschap = "u heeft het verkeerde paswoord ingegeven"
        end if
    end if
    rec.movenext
loop
...


Nu wordt na elke controle een movenext gedaan...

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
Verwijderd schreef op 27 maart 2003 @ 23:34:
[...]

Ik weet ook niet wat hier allemaal al eens langs is gekomen
Het topic lezen is dan een uitkomst. ;)
ik weet alleen dat SQL in deze situatie helemaal geen verkeerde oplossing is. In een dergelijke code zoals door mij hier boven beschreven kun je ook eenvoudig dingen toevoegen zoals IF Blocked = 1 THEN Login = 0.. je snapt me wel :)
Ik heb ook niet gezegd dat SQL een verkeerde oplossing is. ;)
Ik vroeg me gewoon af waarom je niet direct in je SQL controleert op het passwoord. Dat je dus enkel het record ophaalt dat matched met de username en het passwoord.
En als mijn code brak zou zijn, dan vertrouw ik erop dat de mede tweakers dat onderbouwd zullen mededelen aan ons :) denk je niet?

Ik heb nergens gezegd dat je code brak is; ik heb alleen vermeld dat we meestal niet veel hebben aan geposte code als die niet voorzien is van een woordje uitleg.

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 23:02
[nohtml]
justmental schreef op 28 March 2003 @ 08:24:
[...]

Let op dat het password in de quey opnemen soms juist gevoeliger voor SQL injection is.
Als je de userinput goed valideert en voorbewerkt dan is er niets aan de hand,
Daarom heb ik ook vermeld dat je best gebruik maakt van parameters, en de gewoonte om een SQL string te concateneren met de variabelen waarop je wilt zoeken te laten varen.

https://fgheysels.github.io/


Verwijderd

NesQuick: wrm 2 maal een check op EOF?
Do while is volgens mij genoeg. Het is mogelijk zonder sqlsearch:
dim test 'as string
Do While NOT Rec.EOF Or test <> "Ingelogd"
If rec("Naam") = Request("naam") and rec("Paswoord") = Request("paswoord") Then
Response.write("Ge ed u paswoord goe onthoude, proficiat")
test = "Ingelogd"
Else
test = "Niet ingelogd"
Rec.movenext
End If
Loop
Response.write(test)

Ff uit de losse pols, kunnen fouten in zitten...

  • robbert
  • Registratie: April 2002
  • Laatst online: 21:44
ASP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<%
dim boodschap
dim cnn 
dim rec
set cnn = server.createobject("adodb.connection")
set rec = server.createobject("adodb.recordset")
cnn.open "provider=microsoft.jet.oledb.4.0;data source=" & server.mappath("artemis2000.mdb")
rec.open "tbllogin", cnn, 3, 3
rec.movefirst
do while rec.eof = false
     if rec("naam") = request.form("naam") then
     if rec("paswoord") = request.form("paswoord") then
            boodschap = "u bent ingelogd"
      else
             boodschap = "u heeft het verkeerde paswoord ingegeven"
          end if
     end if
     rec.movenext
loop
response.write boodschap
rec.close
set rec = nothing
cnn.close
set cnn = nothing
%>


rec.movenext
zou ik ik na die end if zetten,
nu blijft die namelijk eindeloos die lus uitvoeren zolang het niet aan rec("naam") = request.form("naam") voldoet en dat zal het nooit doen aangezien die niet naar het volgende record gaat. Dat doet die alleen als rec("naam") = request.form("naam") voldoet. :)

[edit]
NTGiant was eerder, had niet alle replies gelezen en zag dit er eerst zo gauw niet tussen :z

[ Voor 15% gewijzigd door robbert op 28-03-2003 17:00 ]


  • shades
  • Registratie: September 2001
  • Laatst online: 10-08 15:01

shades

huh ?

check die functie nou gewoon die ik gegeven heb...

gebruik hebm zo:
MagUserVerder = CheckCredentials() <- true/false

Als je hem aanpast kan ie zo worden:
MagUserVerder = CheckCredentials(user, password) <- true/false

[ Voor 3% gewijzigd door shades op 28-03-2003 19:45 ]

https://k1600gt.nl


  • blijhoofd_bennie
  • Registratie: Maart 2000
  • Niet online

blijhoofd_bennie

Wasser für alle!!

gorgi_19 schreef op 28 March 2003 @ 08:06:
[...]


Ik vraag me trouwens in het algemeen af waarom niemand het belang ziet van het controleren op bepaalde tekens...
Nou dan heb je een medestander :)
Checklist voor een beetje een kwalitatieve ASP site (met invoervelden wel te verstaan)
- checken op bepaalde speciale tekens zoals bijv. 's (deze fout wordt veel gemaakt)
- HTML code encode met Server.HTMLEncode (deze fout wordt veel gemaakt)
- en er zullen er zekers nog wel zat andere zijn, die ik nog lang niet weet.
Pagina: 1