Avatar billede rille101 Nybegynder
09. august 2006 - 14:25 Der er 25 kommentarer og
1 løsning

session baseret login sytem skal cookie baseres

Hej
Har lavet et loginsystem der opretter en session, hvis en bruger logger ind. Problemet er at det virker ad H til.
Det er meningen at, når en bruger er logget ind, så skal sessionen vare en time, men fakta er, at man bliver logget ud i tide og utide. Nogle gange rigtignok efter en time, men andre gange efter blot et par minutter.

Derfor vil jeg gerne have en cookie til at styre det, da jeg har ladet mig fortælle, at disse er mere stabile.

Jeg har ikke arbejdet med cookies før, så jeg mangler hjælp til at få lavet sytemet om, således at der lagres en cookie på brugerens PC. Denne skal så leve i en time, eller indtil brugeren klikker på en "Log ud" knap.


Her er nogle forskellige kodestykker:

Login/logud formular, der befinder sig på alle sider:

<%
  If Not Session.contents("login") = true Then
%>           
            <form name="login" method="post" action="../lokalinfo/login_tjek.asp">
              <table width="134" height="150" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td width="7"><br>
 
    <label></label>  </td>
                  <td valign="top"><br>
                  Brugernavn
                      <input name="brugernavn" type="text" id="brugernavn" size="15">
                 
                    <br>
                    <br>
Password
<input name="password" type="password" id="password" size="15">
                   
                    <br>
                    <a href="#" onClick="document.login.submit();"><br>
[Log ind]<br>
                    </a></td>
                </tr>
              </table></form>
              <%else%>
                <%
Dim RSbruger
Dim RSbruger_numRows

Set RSbruger = Server.CreateObject("ADODB.Recordset")
RSbruger.ActiveConnection = MM_ballumby_STRING
RSbruger.Source = "SELECT *  FROM brugere  WHERE brugernavn =  '" & Session.contents("brugernavn") & "'"
RSbruger.CursorType = 0
RSbruger.CursorLocation = 2
RSbruger.LockType = 1
RSbruger.Open()

RSbruger_numRows = 0
%>
              <table width="134" height="150" border="0" cellpadding="0" cellspacing="0">
                <tr>
                  <td width="7">
                    <label></label></td>
                  <td valign="top"><strong><br>
                    Hej <%=(RSbruger.Fields.Item("fornavn").Value)%></strong>.<br>
                    <br>
Du kan nu bruge &nbsp;<br>
Styringsmenuen forneden.<br>
<br>
Husk at logge ud n&aring;r du forlader din pc.
<br>
<br>
<a href="../lokalinfo/logout.asp">[Log ud]</a></td>
                </tr>
              </table>             
              <%end if%>

-------------------------------
login_tjek.asp: Side der tjekker login formularen
-------------------------------
<%
    Set Conn = Server.CreateObject("ADODB.Connection")
    Set MyRS = Server.CreateObject("ADODB.RecordSet")

    MyConnection = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("/db/database.mdb")
    Conn.Open MyConnection
    MySQL = "Select * from Brugere where brugernavn='" & request.form("Brugernavn") & "'"

' response.write(MySQL)
    set MyRS = Conn.Execute(MySQL)

if MyRS.EOF then
Response.Redirect (Request.ServerVariables("HTTP_REFERER"))

elseif request.form("password")=MyRS("password") then
Session("login")=True
Session("brugernavn")= MyRS("brugernavn")
Session("rang")= MyRS("rang")


MyRS.Close
Conn.Close

Response.Redirect (Request.ServerVariables("HTTP_REFERER"))

else
Response.Redirect (Request.ServerVariables("HTTP_REFERER"))
end if
%>


----------------------------
Denne kode ligger på alle sider, og skal sørge for at man fortsat er logget ind.
----------------------------

<%Session.Timeout=60%>


----------------------------
Denne kode findes på alle "lukkede" sider:
----------------------------

If Not Session.contents("login") = true Then
  response.Redirect("../denied.asp")
  else
  if Session.contents("rang") <> "admin" AND Session.contents("rang") <>"superbruger" AND Session.contents("rang") <>"bruger" Then
  response.Redirect("../denied.asp")
  end if
end if

er der nogen der kan hjælpe mig med at få løst dette problem???
Avatar billede keysersoze Ekspert
09. august 2006 - 14:43 #1
der er fordele og ulemper ved begge dele - men at cookies skulle være mere stabile end sessions har jeg nu aldrig hørt. Kun i de tilfælde hvor webserveren har nogle problemer, og det ser ud som det er det du er ude for, vil cookies virke mere stabile.

I bund og grund ville jeg mene det var utrolig synd hvis du skiftede til cookies - så var en mulighed måske at finde et mere stabilt sted (for som sagt lyder det som om det er det der er problemet). Men hvis du endelig vil skifte er der i bund og grund ikke den store forskel - du kan læse lidt om det på nednstående links.

http://activedeveloper.dk/articles/30/
http://activedeveloper.dk/articles/168/
http://activedeveloper.dk/articles/68/
http://activedeveloper.dk/articles/27/
Avatar billede rille101 Nybegynder
09. august 2006 - 15:42 #2
okay, tak for artiklerne, dem vil jeg lige studere lidt nærmere.
Jeg har mit websted hos web10, og det var dem der anbefalede mig at bruge cookies, da jeg lagde et indlæg om problemet i deres forum.

Men hvorfor er det synd at skifte?
Og ville jeg opleve de samme problemer med cookies, hvis det er webstedet der er problemet?
Avatar billede keysersoze Ekspert
09. august 2006 - 16:58 #3
nej - du vil ikke opleve samme problemer med cookies, for der tjeckes brugeren ud fra en fil hos client hvorimod sessions er afhængige af at webserveren er i live. Dvs - genstartes services på serveren vil en bruger med sessions blive tabt hvorimod en bruger med cookie vil leve videre.

Grunden til at det er synd er meget kort sagt at det er lettere at blokere for cookies end session, at sikkerheden omkring sessions er større og at du lettere oplever problemer med cookies der ikke helt vil som du vil.

web10 er - med al respekt - nok heller ikke blandt de hurtigste knive i glashuset... eller deromkring :)
Avatar billede rille101 Nybegynder
09. august 2006 - 22:26 #4
hehe! Det kan du ho have ret i. Man får jo hvad man betaler for...
Jeg vil ikke spørge om et bedre alternativ til web10 i dette spm, for så kommer det starter altid en heftig debat, men hvis det bliver tilfældet, så opretter jeg et nyt spm. til det...

Med de grunde du giver, kan jeg jo godt se, at det er bedst at holde mig til sessions.

Jeg vil se, hvad beslutningstagerne siger til at skifte webhotel.

Men indtil da, er jeg stadig åben for hjælp til at skifte mine koder fra sessions til cookies.
Avatar billede rille101 Nybegynder
17. august 2006 - 15:35 #5
Hmm. der er desværre ikke penge til at skifte til de dyrere og mere stabile webhoteller, så derfor bliver jeg i første omgang nødt til at skrue kvaliteten på hjemmesiden lidt ned og cookie basere den.

Kan du hjælpe keysersoze?
Jeg vil egentlig bare gerne se, hvordan mine session scripts bliver lavet om til cookie scripts.

Så skulle jeg nok selv kunne klare resten...
Avatar billede keysersoze Ekspert
17. august 2006 - 15:47 #6
jamen - det er jo næsten bare search and replace? alle de steder der står noget med session udskifter du med en cookie?
Avatar billede rille101 Nybegynder
17. august 2006 - 17:21 #7
Er det det???
Hold da op, det var næsten for nemt til at være sandt.

vi får vist et tordenskrald nu, så jeg må hellere lukke, men vil da prøve det i aften/morgen så...
Avatar billede keysersoze Ekspert
17. august 2006 - 17:36 #8
i bund og grund så ja - logud er lidt anderledes og du har andre muligheder, men alt det står i de links jeg har givet.
Avatar billede ksoren Nybegynder
17. august 2006 - 18:04 #9
Du må ikke bare lave en search og replace. Hvis du ikke vil benytte sessions, skal hele designet laves om.

En bruger kan selv ændre indholdet i sine cookies. Så en search/replace på ovenstående vil betyde, at en bruger kan logge sig ind som en anden bruger, give sig selv administrative rettigheder etc
Avatar billede keysersoze Ekspert
17. august 2006 - 18:15 #10
der er allerede skrevet at sikkerheden er betydelig lavere ved cookies så medmindre der er sprunget let og elefant hen over den kommentar bør man allerede være opmærksom på dette.

Et alternativ er selvfølgelig at begynde at lege med kryptering af indholdet i cookien - men mon ikke hele cookie-systemet skal virke før man begynder at tage fat på den del.
Avatar billede keysersoze Ekspert
17. august 2006 - 18:15 #11
... altså, medmindre du har et bedre forslag ksoren?
Avatar billede ksoren Nybegynder
17. august 2006 - 18:33 #12
Der skal nok gemmes en beregnet værdi ud fra brugerens data + noget random data + en nøgle kun kendt af serveren.

Ved hvert kald beregnes værdien igen, og kontrolleres med den værdi som ligger i cookien. Kun hvis de to værdier er ens, er dataene korrekt. Noget i denne stil

Response.Cookies("username") = "ksoren"
Response.Cookies("rnd") = random generet værdi på x antal karakterer
Response.Cookies("control") = MD5(username & rnd & nøgle)

MD5(username & rnd & nøgle) udføres ved alle kald, og sammenlignes med control cookien. Brugeren kan ikke selv beregne control værdien, da han ikke har kendskab til den hemmelige nøgle
Avatar billede keysersoze Ekspert
17. august 2006 - 20:07 #13
altså også som skrevet - men igen, mon ikke selve cookie-delen skal virke før man begynder at tale om kryptering ;)
Avatar billede rille101 Nybegynder
17. august 2006 - 22:15 #14
Så for dælen. Nu kommer jeg nok ud på dybt vand.
Men det ser ud til at I har fat det rigtige til mig.

Jeg prøver lige at lave en login funktion, der er baseret på cookies, ud fra de artikler du gav mig keysersoze.
Hvis jeg altså kan finde ud af det. (ellers skal jeg nok sige til:)

Når jeg har det, får jeg brug for hjælp til at kryptere det.
Avatar billede rille101 Nybegynder
18. august 2006 - 10:34 #15
OK, nu har jeg fået lavet et lille login modul baseret på cookies.

------------forside.asp----------------
<%If Not request.cookies("test")("login") = "true" Then%>
<form name="form1" method="post" action="login_tjek.asp">
<input name="brugernavn" type="text" id="brugernavn">
<input name="password" type="password" id="password">
<input type="submit" name="Submit" value="    OK    ">
</form>


------------login_tjek.asp-------------
<response.buffer = "true"%>
<%
    Set Conn = Server.CreateObject("ADODB.Connection")
    Set MyRS = Server.CreateObject("ADODB.RecordSet")

    MyConnection = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("/db/test.mdb")
    Conn.Open MyConnection
    MySQL = "Select * from Brugere where brugernavn='" & request.form("Brugernavn") & "'"

' response.write(MySQL)
    set MyRS = Conn.Execute(MySQL)

if MyRS.EOF then
Response.Redirect (Request.ServerVariables("HTTP_REFERER"))

elseif request.form("password")=MyRS("password") then
Response.Cookies("test")("login") = "true"
Response.Cookies("test")("brugernavn") = MyRS("brugernavn")
Response.Cookies("test")("Rang") = MyRS("rang")

MyRS.Close
Conn.Close

Response.Redirect (Request.ServerVariables("HTTP_REFERER"))

else
Response.Redirect (Request.ServerVariables("HTTP_REFERER"))
end if
%>


--------------hemmelig.asp--------------
'dette ligger øverst på alle interne sider
<%
  If Not request.cookies("test")("login") = "true" Then
  response.redirect("denied.asp")
end if
%>


-------------logout.asp-----------------
<%
' slet værdierne i alle cookies
response.cookies("test")("login") = "false"
response.cookies("test")("brugernavn") = ""
response.cookies("test")("rang") = ""
' og videresend brugeren
Response.Redirect (Request.ServerVariables("HTTP_REFERER"))
%>

Lige nu har jeg <%response.buffer = true%> øverst på alle sider, hvad gør det egentlig godt for?

Ser mine koder fornuftige ud? Det virker i hvertfald.
Nu mangler jeg vist lidt hjælp til krypteringen...
Avatar billede rille101 Nybegynder
23. august 2006 - 15:42 #16
Er der håb endnu?
Avatar billede keysersoze Ekspert
26. august 2006 - 09:24 #17
godt nok er md5 ikke direkte kryptering men hash - det vil dog kunne gøre det sværere for de fleste at snyde med systemet; http://www.asp-faq.dk/article/?id=52
Avatar billede rille101 Nybegynder
28. august 2006 - 10:32 #18
hash småkager, hmmm....
Jeg er lidt forvirret.
I den artikel står der at passwords skal gemmes som hashed værdier i databasen.
er det det jeg skal gøre også? eller skal jeg hashe selve cookien?

Kan godt, ved oprettelse af ny bruger få den til at gemme passwordet som en hashed værdi.
Problemet er så bare, at når jeg vil logge på, så skal det være med hash værdien som adgangskode :)
Avatar billede unknown_someone Juniormester
28. august 2006 - 10:43 #19
burde være tilstrækkeligt bare at gøre det til cookien.
Avatar billede rille101 Nybegynder
28. august 2006 - 11:16 #20
Men hvordan gør jeg så det?
Avatar billede keysersoze Ekspert
28. august 2006 - 11:34 #21
som allerede foreslået burde det være nok at hashe ud til cookien - der er intet forkert i at gøre det til databasen, men det andet er nok det letteste.

Hvordan du skal gøre synes jeg er rimeligt forklaret i den artikel jeg linkede til?
Avatar billede rille101 Nybegynder
28. august 2006 - 13:33 #22
Det er nok også bare mig der ikke helt kan se vejen.
Som jeg har forstået det, så skal den side der skriver cookien være således:

Response.Cookies(md5("test")).Expires = DateAdd("h", 1, Now())
Response.Cookies(md5("test"))("login") = "true"
Response.Cookies(md5("test"))("brugernavn") = MyRS("brugernavn")
Response.Cookies(md5("test"))("Rang") = MyRS("rang")

og cookien kan så hentes med f.eks.:

If Not request.cookies(md5("test"))("login") = "true" Then
response.redirect("denied.asp")
end if

Har jeg ret?

Men hvad er det egentlig lige md5 gør?
Mit bud er at, når en hashed cookie ligger på computeren, så skal man lede sig frem til den pågældende cookie, hvis man har ønsker at misbruge siden, har jeg ret i det?

Mine testsider virker, kunne bare godt lige tænke mig at vide, hvad det egentlig er jeg laver :)
Avatar billede keysersoze Ekspert
13. september 2006 - 11:35 #23
du skal ikke md5'e navnet på din cookie - kun indholdet og nok også kun følsomme oplysninger

Response.Cookies("test")("brugernavn") = md5(MyRS("brugernavn"))
Avatar billede rille101 Nybegynder
13. september 2006 - 12:33 #24
okay :)
Nu har jeg godt nok md5'et både cookies og hele pivtøjet.
Det virker godt nok, men er det et problem at jeg har hashed selve cookie'erne også?
Avatar billede keysersoze Ekspert
13. september 2006 - 12:51 #25
det tør jeg ikke sige - men formentlig ikke når nu det virker.
Avatar billede rille101 Nybegynder
13. september 2006 - 13:36 #26
Jeg lader det være som det er, så kan jeg altid rette i det, hvis der skulle opstå problemer.
Mange tak for hjælpen. så fik jeg endelig lært at arbejde med cookies, også!
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