05. september 2003 - 22:26Der er
74 kommentarer og 1 løsning
Simpelt adgangskontrol
Jeg ved ikke om man kan, eller hvordan man gør, men jeg skal lave en vildt simpel password kontrol.
brugernavn : (personens fornavn) kodeord : (et eller andet som genereres fra det indtastede brugernavn)
Kan man det ? jeg forestillede mig noget med at hente en talværdi ud fra det indtastede brugernavn. Dvs at den besøgende tror det er et vildt vanskeligt kodeord, men i virkeligheden, kan jeg med det samme fortælle en ny bruger, hvad hans kodeord vil være UDEN at jeg skal til at indtaste personen i en database eller i det hele taget lave noget som helst.
Det kan da gøres lettere. Du laver en database med brugernavne og password.
Du laver en side hvor en sessionsvariabel sættes til false. Herefter søges på det bruger navn og password brugeren taster ind og hvis det matcher kombinationen i databasen sættes sessionsvariablen til true.
Herefter indbygger du et check på alle dine sider der hvis sessionsvariablen er true viser sider, ellers redirecter til den loginside hvor brugernavn og password indtastes.
Hvis ikke du bruger en database vil alle brugere jo skulle have samme brugernavn og password og det giver ikke den store sikkerhed. hvis det er dette du vil, kan do downloade masser af færdige scripts der sætter et password på siden med javascript. Den løsning jeg beskriver giver langt bedre sikkerhed og giver også flere muligheder hvis du tænker dig en smule om.
Bufferzone>> Brugeren har ikke samme brugernavn og password. Passwordet genereres ud fra brugernavnet, og brugerne kender ikke systemet. men de skal angive passwordet og asp-systemet kan så straks afgøre om det er rigtigt.
man kan vælge at: - bruge database der indeholder brugernavn og password - bruge tekstfil der indeholder brugernavn og password - hardcode, dvs. skrive brugernavn og password direkte i asp filen
hvis man bruger en tekstfil, skal man være sikker på at serveren man bruger, tillader at man bruger FileSystemObject.. FSO bruges til at læse filer/mapper osv..
husk ikke at bruge et bestemt tal til et bestem bogstav.. f.eks.: 01 = a, 02 = b, 03 = c, 04 = d, 05 = e, osv..
passwordet til brugenavnet "abe" bliver så 010205.. finder man algoritmen, kan man nemt komme ind på andre brugers konti..
hvis vi nu siger at en person hedder "bent" og trækker talværdi ud af det "251420" (b=2 e=5 n=14 t=20) og i en login.asp laver noget i stil med "if request("user")=talværdi then ..."
forstår i den ? jeg mangler bare at kunne trække en eller anden værdi ud af navnet "Bent"
du vil ikke bruge database.. hvad vil du så bruge?: - tekstfil der indeholder brugernavn og password - hardcode, dvs. skrive brugernavn og password direkte i asp filen
nej jeg mener ikke det skulle være nødvendigt at skrive nogen password ind i nogen filer. Jeg laver en: login1.asp (med form felter) og en login2.asp som så kontrollere om den værdi dder er skrevet i formfelt "password" er talværdien af det der er skrevet i formfelt "user"
botha, hvis du vil generere passwords på denne måde, og nogen skulle få fat i din algoritme, vil samtlige brugere med ét smæk blive kompromitteret. Eller det gør måske heller ikke noget?
**form-sektion (submitter til samme fil)** form-start input-brugernavn input-password button-submit form-slut
**asp-sektion** indkode brugernavn sammenlign password med kodet-brugernavn hvis password = kodet-brugernavn lav session, så bruger er logget ind ellers vis fejlmeddelse hvis-slut
squashguy> jeg har prøvet at forklare dette til botha @ 05/09-2003 22:41:53 og han/hun forstår det godt, men vil alligevel gerne ha' det så'n (se 05/09-2003 22:42:46 og 05/09-2003 22:44:47)
Her er et lille VBscript, hvor et navn bliver omdannet til en talkode. For at afgøre om et password er rigtigt skal man blot sammenligne kode(navn) med det password brugeren taster ind function kode(navn) x=1 for i=1 to len(navn) x=sin(asc(mid(navn,i,1))*x)*10 next kode=abs(round(x*10000000)) end function
Password ok, hvis PW=kode(navn) her er PW, det password brugren indtaster og navn er hans brugernavn.
Funktionen kode kan laves helt som man har lyst. Den jeg her har lavet vil næppe kunne brydes af nogen.
->the surfer : ja noget i den stil, men jeg ville meget gerne de brugbare koder :-) OG det er ikke noget hvor nogen har noget ud af at logge sig ind som en anden (bortset fra at de så bliver tiltalt som en anden) Så derfor er det ligemeget om nogen "gætter" systemet. Jeg skal sendes videre til "velkommen.asp" med en request streng = brugernavn
dette bliver nu til en egentlig opgave - undskyld (men jeg er ikke stiv i VB) så jeg forhøjer til 200 point.
som jeg skrev : login1.asp = 2 formfelter "User" og "password" login2.asp = tjek om user og password matcher og send så videre til fejlside eller til velkommen.asp?user=(user)
Her er kontrol-siden. login2.asp: <% Option Explicit dim UN, PW function kode(navn) Dim i, x x=1 for i=1 to len(navn) x=sin(asc(mid(navn,i,1))*x)*10 next kode=abs(round(x*10000000)) end function
UN=request.form("UN") PW=request.form("PW")
if kode(UN)=PW then Response.redirect("PasswordOK.asp") else Response.redirect("Fejl.asp") end if %>
du kan lave koder på denne måde: LAv en tekstfil som du kalder kode,vbs, og gem den f.esk. på skrivebordet.
Lad indholdet være
function kode(navn) x=1 for i=1 to len(navn) x=sin(asc(mid(navn,i,1))*x)*10 next kode=abs(round(x*10000000)) end function navn=InputBox("Indlæse et navn: ") MsgBox kode(navn)
Du har fået en ret indviklet måde at lave kode på udfra et navn. Du kan ikke regne koden ud selv, men skal benytte ovenstående lille VBscript til at frembringe koden. Hvis man skrev kode(Ucase(navn)) blev der ikke gjort forskel på små og store bogstaver. Så var det ikke case-sensitivt.
Hvis det skal være et system, du selv kan regne ud uden det store besvær, så vil det nok være for let at bryde koden.
prøv at lægge funktionen kode ind i login-siden og tilføj lige før </body> <%response.write("bent")%> så kan du se om koden for bent bliver lavet rigtigt.
dette er nu min login2.asp: <% Option Explicit dim UN, PW function kode(navn) Dim i, x x=1 for i=1 to len(navn) x=sin(asc(mid(navn,i,1))*x)*10 next kode=abs(round(x*10000000)) end function
UN=request.form("UN") PW=request.form("PW")
if kode(UN)=PW then Response.redirect("PasswordOK.asp") else response.write"fejl side" response.write(kode("bent")) ' Response.redirect("Fejl.asp") end if %>
jeg glemte, at denne side ikke har en html-del. gør sådan: <%
lad være med at redirecte men tilføj i stedet html-delen >% <html> <body> <%response.write(PW)%> <p> <%response.write(kode("bent"))%> <p> <%response.write(kode(UN))%> </body> </html>
min login2.asp ser lige nu sådan ud : <% Option Explicit dim UN, PW function kode(navn) Dim i, x x=1 for i=1 to len(navn) x=sin(asc(mid(navn,i,1))*x)*10 next kode=abs(round(x*10000000)) end function
UN=request.form("UN") PW=request.form("PW")
if kode(UN)=PW then Response.redirect("PasswordOK.asp") else response.write"<br>PW=" response.write(PW) response.write"<br>UN=" response.write(kode("UN")) response.write"<br>bent =" response.write(kode("bent")) ' Response.redirect("Fejl.asp") end if %>
ja, men jeg frygtede, at hvis <html>.... manglede ville det gå i fisk. Du skal udskrive dette: response.write(PW) , response.write(kode("UN")) samt response.write(kode("bent"))
Nu har jeg fundet fejlen. Det er en af de klassiske, som jeg har hjulpet med en del gange, og nu har jeg selv lavet den.
Når man modtager noget med request.... får man en tekststreng i hovedet. Kode(UN) er et tal. Derfor skal sammenligningen mellem PW og Kode(UN) ændres til
Clng konverterer en tekststreng til et tal, hvis det kan lade sig gøre. Hvis brugeren havde kludret og ikke tastet et tal vil Clng ikke fungere. Defor bør testen ændres til:
if not isNumeric(PW)then response.redirect("fejl.asp") if kode(UN)=Clng(PW) then Response.redirect("PasswordOK.asp") else Response.redirect("Fejl.asp") end if
det var så lidt. Jeg takker for point. Jeg lægger nok et par andre forslag til kode-funktioner ind i morgen. Jeg vil lave en, der giver tekst i stedet for tal.
Her er en funktion, der laver en bogstavkode med 6 bogstaver udfra bugernavnet.
function kode(navn) dim i,j,x,kodeord,s kodeord="qwerdzxL" for i=1 to len(kodeord) x=1 for j=1 to len(navn) x=(x*Asc(Mid(navn,j,1)) + Asc(Mid(kodeord,i,1))) mod 1997 next s=s & Chr(x*i mod 26 + 65) next kode=Lcase(Mid(s,1,6)) end function
Du kan teste den ved blot at tilføje linien MsgBox kode(InputBox("Indlæs et navn: ")) og så gemme den som en fil med navnet password.vbs Hvis du klikker på den kan du indlæse et navn, og den udskriver en bogstackode med 6 bogstaver.
Synes godt om
Ny brugerNybegynder
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.