læse linie of split det ved "=" så det kommer til at være: variabel "user" = "brugernavn1", variable "pass" = "password1" derefter sammenligner du det fu får fra formen (med request.form("felt navn") med de respektive værdier ("user" og "pass"):
if request.form("usename") = "user" then if if request.form("password") = pass" then response.write "Du er nu logget ind" ' gå videre end if else response.write "Forkert brugernavn eller password" end if
hvis du bruger "Forkert brugernavn eller password" (i stedet for "Forkert brugernavn" og "Forkert password) kan du undgå at en "hacker" finder et brugernavn og prøver på at gætte password, da han/hun ikke ved om brugernavnet eksistere..
jeg vil mene at det er lige så sikkert som en database..
hvis du i stedet for en txt bruger en asp og har brugernavn=password som kommentar, vil det ikke blive udskrevet hvis "hackeren" skulle finde navnet på adgangsfilen:
-- userpass.asp start:
'brugernavn1=password1 <-- kan ikke ses 'brugernavn2=password2 <-- kan ikke ses
validate.asp (check om brugernavn og password passer):
<% Option Explicit ' tving programmøren til at definere variabler (undgår stavefejl)
' vi definere vores variabler: dim strUP, strOK, strMessage dim arrLine, arrUserPass dim i
'''''''' læser fra fil:
Dim fso, f, filespec Set fso = CreateObject("Scripting.FileSystemObject") filespec = Server.Mappath("userpass.asp") Set f = fso.OpenTextFile(filespec,1)
' Læs linie for linie indtil slutningen af filen Do While not f.AtEndOfStream ' hvis linien starter med ', er det "gyldigt" og tilføjes strUP if left(f.ReadLine, 1) = "'" then strUP = strUp & f.ReadLine & ";" Loop
f.Close
'''''''''''''''''''
' vi sætter vores variabler: strOK = "nej"
arrLine = Split(strUP,";") ' split start-strengen ved ";"
For i = LBound(arrLine) to UBound(arrLine) ' loop så længe der er data
strUP = replace(strUP,"'","") ' fjerner voes "'"-check thingest arrUserPass = Split(strUP,";") ' splitter brugernavn og password ved ";"
' der skal være noget at arbejde med, ellers giver den fejl: if left(arrUserPass(i), InStr(arrUserPass(i), "=") - 1) <> "" then
' her sammenligner vi det indstastede brugernavn med det fra filen: if request.form("username") = left(arrUserPass(i), InStr(arrUserPass(i), "=") - 1) then
' brugernavn er ok, så vi sammenligner password: if request.form("password") = mid(arrUserPass(i), InStr(arrUserPass(i), "=") + 1) then ' brugernavn og password er ok: strOK = "ja" ' checkpoint end if end if end if
Next ' loop if strOK = "ja" then ' gå videre response.write "Du er nu logget ind" else ' hvis fejlmeddelse: response.write "Forkert brugernavn eller password" end if
%>
userpass.asp:
<% 'brugernavn1=password1 'brugernavn2=password2 %> Fis af makker :)
det var sådan set det :) .. det er lidt komplex, men det virker.. dog skal jeg lige sige at jeg ikke har haft mulighed for at læse fra filen (min IIS fejlede, og frip.dk tillader ikke brugen af FileSystemObject).. så jeg brugte en streng til at simulere indholdet af den læste fil:
if strOK = "ja" then ' gå videre response.write "Du er nu logget ind"
' vi gemmer et "ja" i en session kaldet login, ' så kan vi checke om brugeren er logget ind eller ej Session("login") = "ja" else ' hvis fejlmeddelse: response.write "Forkert brugernavn eller password"
' det samme som op i strOK = ja, bare "nej" :) Session("login") = "nej" end if
' den checker om brugeren er logget ind.. hvis han/hun ikke er det, sendes de til login siden: <% if session("login") <> "ja" then response.redirect "login.asp" %>
-- tilføjelse (indsættes i ALLE de hemmelige sider): <!-- #include file="protection.asp" //-->
Og så kontrol.asp <% If request.form("user")="Minbruger" AND request.form("pass")="Hemlig" then %> <html> <head><title>Yesyes</title></head> <body> Du er inde!!! </body> </html> <% else response.redirect "/login.asp" end if %>
* hvis man hardcode username/password ville der kun være 1 person der kunne komme ind.. eller flere om samme login.. * du har hverken brugt session eller cookie, hvilket betyder at den eneste side du beskytter er "kontrol.asp".. der er vist ikke så meget at beskytte på den :)
theSurfer's metode: * du beskytte alle dine sider * du kan have flere bruger med forskellige logins.. det kan udbygges til user levels, dvs forskellige niveauer som folk har adgang til
thesurfer>> Ja okay, jeg kan da godt sætte en session så det virker på alle side, ikke svært :O) efter følgdende: If request.form("user")="Minbruger" AND request.form("pass")="Hemlig" then insætter du en linie med Session("adgang")="ok" Du kan så lave en logout.asp som ser således ud <% Session("adgang")="" Response.redirect "/login.asp" %>
Du skal så på alle sider der er hemlige kontroler om sessionen er ok
Hvis du vil har felere brugere, gå ikke ud fra du vil have rigtig mange da du skriver at du ikke vil bruge database.. :O) Men hvis du vil kan du bare bruge følgende: If (request.form("user")="Minbruger" AND request.form("pass")="Hemlig") OR (request.form("user1")="Minbruger" AND request.form("pass")="Hemlig1") OR (request.form("user")="Minbruger" AND request.form("pass")="Hemlig") then
<!-- #include file="protection.asp" //--> <% Option Explicit ' tving programmøren til at definere variabler (undgår stavefejl)
' vi definere vores variabler: dim strUP, strOK, strMessage dim arrLine, arrUserPass dim i
'''''''' læser fra fil:
Dim fso, f, filespec Set fso = CreateObject("Scripting.FileSystemObject") filespec = Server.Mappath("userpass.asp") Set f = fso.OpenTextFile(filespec,1)
' Læs linie for linie indtil slutningen af filen Do While not f.AtEndOfStream ' hvis linien starter med ', er det "gyldigt" og tilføjes strUP if left(f.ReadLine, 1) = "'" then strUP = strUp & f.ReadLine & ";" Loop
f.Close
'''''''''''''''''''
' vi sætter vores variabler: strOK = "nej"
arrLine = Split(strUP,";") ' split start-strengen ved ";"
For i = LBound(arrLine) to UBound(arrLine) ' loop så længe der er data
strUP = replace(strUP,"'","") ' fjerner voes "'"-check thingest arrUserPass = Split(strUP,";") ' splitter brugernavn og password ved ";"
' der skal være noget at arbejde med, ellers giver den fejl: if left(arrUserPass(i), InStr(arrUserPass(i), "=") - 1) <> "" then
' her sammenligner vi det indstastede brugernavn med det fra filen: if request.form("username") = left(arrUserPass(i), InStr(arrUserPass(i), "=") - 1) then
' brugernavn er ok, så vi sammenligner password: if request.form("password") = mid(arrUserPass(i), InStr(arrUserPass(i), "=") + 1) then ' brugernavn og password er ok: strOK = "ja" ' checkpoint end if end if end if
Next ' loop if strOK = "ja" then ' gå videre response.write "Du er nu logget ind"
' vi gemmer et "ja" i en session kaldet login, ' så kan vi checke om brugeren er logget ind eller ej Session("login") = "ja" else ' hvis fejlmeddelse: response.write "Forkert brugernavn eller password"
' det samme som op i strOK = ja, bare "nej" :) Session("login") = "nej" end if
"Har problemer. Paster validate.asp".. problemer?.. så er det jeg spørg igen: hvilken fejl får du? skriv hele fejl, dvs nummer, linie, beskrivelse osv..
Dim fso, f, filespec Set fso = CreateObject("Scripting.FileSystemObject") filespec = Server.Mappath("userpass.asp") Set f = fso.OpenTextFile(filespec,1)
' Læs linie for linie indtil slutningen af filen Do While not f.AtEndOfStream ' hvis linien starter med ', er det "gyldigt" og tilføjes strUP if left(f.ReadLine, 1) = "'" then strUP = strUp & f.ReadLine & ";" Loop
f.Close
og indsæt det her: strUP = "'brugernavn1=kodeord1;'brugernavn2=kodeord2;'brugernavn3=kodeord3;'brugernavn4=kodeord4"
hvis siden vises, kan du bruger brugernavnX (X=1-4), og password kodeordX (X=1-4)
Så er jeg på banen igen. Da det fungerer hos dig kan du så ikke paste koden som fungerer, jeg kan ikke finde ud af de tilføjelser/korigeringer. Skal der være 5 filer :)
skal bruges (minimum, mener jeg): * login side - som også validere brugernavne og passwords * logout side - som logger brugeren ud * password fil - som indeholder brugernavne og passwords * protection/krav side - som stiller krav til hvem må se siden (logged in, level, osv)
når noget ikke virker, skal du altid skrive fejlens nummer og beskrivelse, samt hvilken linie der er fejl i, som også har et nummer..
<% 'brugernavn1=password1 'brugernavn2=password2 %> Fis af makker :)
opret en fil ("read.asp") med indholdet:
Dim fso, f, filespec Set fso = CreateObject("Scripting.FileSystemObject") filespec = Server.Mappath("userpass.asp") Set f = fso.OpenTextFile(filespec,1)
' Læs linie for linie indtil slutningen af filen Do While not f.AtEndOfStream ' hvis linien starter med ', er det "gyldigt" og tilføjes strUP if left(f.ReadLine, 1) = "'" then strUP = strUp & f.ReadLine & ";" Loop
f.Close
reponse.write "strUP: " & strUP
se om det virker.. hvis det virker, paste den linie du får i dit vindue når du loader read.asp i din browser.. den skulle starte med:
arrLine = Split(strUP,";") ' split start-strengen ved ";"
For i = LBound(arrLine) to UBound(arrLine) ' loop så længe der er data
strUP = replace(strUP,"'","") ' fjerner voes "'"-check thingest arrUserPass = Split(strUP,";") ' splitter brugernavn og password ved ";"
' der skal være noget at arbejde med, ellers giver den fejl: if left(arrUserPass(i), InStr(arrUserPass(i), "=") - 1) <> "" then
' her sammenligner vi det indstastede brugernavn med det fra filen: if request.form("username") = left(arrUserPass(i), InStr(arrUserPass(i), "=") - 1) then
' brugernavn er ok, så vi sammenligner password: if request.form("password") = mid(arrUserPass(i), InStr(arrUserPass(i), "=") + 1) then ' brugernavn og password er ok: strOK = "ja" ' checkpoint end if end if end if
Next ' loop if strOK = "ja" then ' gå videre response.write "Du er nu logget ind"
' vi gemmer et "ja" i en session kaldet login, ' så kan vi checke om brugeren er logget ind eller ej Session("login") = "ja" else ' hvis fejlmeddelse: response.write "Forkert brugernavn eller password"
' det samme som op i strOK = ja, bare "nej" :) Session("login") = "nej" end if
hmm.. jeg har prøvet på finde ud af hvad det er der gør at melder fejl.. det er denne linie: Set f = fso.OpenTextFile(filespec,1) altså når den åbener tekst filen for at læse fra den..
efter Session("login") = "ja" indsætter du den kode der skal udføres.. f.eks. (send brugeren videre til topsecret.asp): response.redirect "topsecret.asp"
det har du ret i, hvis brugerne ikke havde adgang til det område.. men jeg ville aldrig nøjes med en txt fil.. jeg ville foretrække en asp, pga ekstra sikkerhed.. men ja, du har ret..
jeg har testet script og det virker.. jeg ved dog ikke hvorfor læse-delen ikke virker.. hvis jeg kører den del et par gange, vil jeg få beskeden "HTTP 403.9 - Access Forbidden: Too many users are connected"
det er denne linie der skaber problemer (åbner tekst filen til læsning):
det mærkelige er at læse-delen er noget jeg har fundet på nettet, på forskellige sites hvor man kan lærer asp.. så det virker selvfølgelig.. men jeg ved ikke hvorfor jeg ikke kan bruge det på min IIS i WinXP Pro..
måske skal jeg ændre nogle indstillinger? nogen forslag?
jeg har snakket med 'cesil' via mit spm, og kunne ikke finde en løsning på fejlen..
jeg har lige fundet ud af at det er min WinXP/IIS der fejler.. har nemlig prøvet et "læs fra fil"-script på Win98/PWS, og der virkede fint.. jeg kopierede mappen over til winxp/iis, og så virkede det ikke..
jeg vil kigge på login scriptet i løbet af et par dage.. og så skal det bare virke!..
Undskyld jeg først skriver nu.. jeg havde glemt dig, og så kunne jeg ikke finde spm'et..
Jeg har lavet scriptet færdigt, og det fungere fint.
Jeg har dog kun testet det på PWS (Personal Web Server) i Win98, da min IIS i WinXP (af en eller anden grund) ikke gider at læse fra filer.. sikkert noget med rettigheder (detmå jeg kigge på senere)..
Scriptet indeholder i alt 5 filer: login.asp - logger brugeren ind logout.asp - logger brugeren ud protection.asp - checker om brugeren er logget ind / har tilladelse til at se siden userpass.asp - filen der indeholder username/password
Den 5. fil er page1.asp som er en test side der demonstrerer hvordan scriptet virker.. Filen page1.asp er beskyttet og man skal derfor være logget ind for at kunne se indholdet af den.
Jeg har kommenteret næsten hele scriptet, nogle ting behøver ikke nogen kommentar, men du er meget velkommen til at stille spørgsmål.
Tilgængelige brugernavne og password til denne demonstration er:
Jeg har lavet valideringen af brugernavn og password case-insensitive, dvs "james", "jAmEs" osv er ens.. Hvis du ikke foretrækker at "james" og "jAmEs" skal være forskellige (dvs, case-sensitive i stedet for case-INsensitive), fjener du de 4 "lcase" fra disse 2 linier:
if lcase(request.form("username")) = lcase(left(arrUserPass(i), InStr(arrUserPass(i), "=") - 1)) then
if lcase(request.form("password")) = lcase(mid(arrUserPass(i), InStr(arrUserPass(i), "=") + 1)) then
For at beskytte en side, tilføjer du bare denne linie i TOPPEN (allerøverst): <!-- #include file="protection.asp" //-->
Her er indholdet af de 5 filer:
*** login.asp (logger brugeren ind) ***
<% option explicit ' tving programmøren til at definere variablerne for at undgå stavefejl response.buffer = true ' hele side dannes før den sendes til browseren
dim url url = request.querystring("url") ' se om brugeren er sendt herover af en beskyttet side %> <html> <head> </head> <body onLoad="document.frmLogin.username.focus();">
<a href="page1.asp">Se den beskyttede side her</a> <br><br>
<% select case request.form("mode") case "login" if (request.form("username") <> "") and (request.form("password") <> "") then
dim strUP, strOK, arrLine, i, arrUserPass, strLinie, strFejlBesked
Dim fso, f, filespec Set fso = CreateObject("Scripting.FileSystemObject") filespec = Server.Mappath("userpass.asp") Set f = fso.OpenTextFile(filespec,1)
do while f.AtEndOfStream = false ' så længe vi ikke er nået til slutningen af filen strLinie = f.Readline ' put indholdet af linien over i variablen "strLinie"
' hvis linien starter med "'*" er det en "brugernavn=password"-linie, ' og tilføjes til strUP (strUP = strengen UserPassword) og splittetegnet ";": if left(strLinie, 2) = "'*" then strUP = strUP & strLinie & ";" loop ' gentag
f.Close ' luk filen igen
strOK = "nej" ' CheckPoint: når brugernavn og password er OK, sættes strOK til "ja"
arrLine = Split(strUP,";") ' split start-strengen ved ";"
For i = LBound(arrLine) to UBound(arrLine) ' loop så længe der er data
strUP = replace(strUP,"'*","") ' fjerner voes "'"-check thingest arrUserPass = Split(strUP,";") ' splitter brugernavn og password ved ";"
' der skal være noget at arbejde med, ellers giver den fejl: if left(arrUserPass(i), InStr(arrUserPass(i), "=")) <> "" then
' her sammenligner vi det indstastede brugernavn med det fra filen: if lcase(request.form("username")) = lcase(left(arrUserPass(i), InStr(arrUserPass(i), "=") - 1)) then ' det indtastede brugernavn matchede det fra filen...
' brugernavn er ok, så vi sammenligner password: if lcase(request.form("password")) = lcase(mid(arrUserPass(i), InStr(arrUserPass(i), "=") + 1)) then ' brugernavn og password er ok: strOK = "ja" ' CheckPoint: Vi har fundet brugeren! end if end if end if
Next ' gentag
if strOK = "ja" then ' Brugeren er fundet, fortæl brugeren at han er logged ind: response.write "Information: Du er nu logget ind." Session("login") = "ja" ' session sættes til "ja". Sider kan nu checke om brugeren må se dem.
''''''''''''''''''''''''''''''''''''''' ' Brugeren er nu logget ind. ' ' Hvis brugeren var gået ind på en beskyttet side, og blev sendt tilbage til login siden, ' kan du sende ham tilbage til siden han kom fra.. på den måde skal han ikke selv finde frem ' til siden igen. ' ' Send brugeren tilbage hvor han kom fra (kan deaktiveres ved at sætte et ' tegn foran linien): if url <> "" then response.redirect url
' Hvis du foretrækker at sende brugeren til en bestem side hver gang han logger ind, ' bruger du (fjern ' tegnet): ' response.redirect "side.asp" ' "side.asp" ændres til din side.
'''''''''''''''''''''''''''''''''''''''
response.end ' afslut udskrivningen til browseren. else ' hvis fejlmeddelse: ' response.write "<b>Forkert brugernavn eller password!" Session("login") = "nej" ' session sættes til nej, brugeren afvises ved beskyttede sider.
end if end if strFejlBesked = "Information: <font style='color: #900000; font-weight: bold;'>Forkert brugernavn eller password</font>" end select %>
<% session("login") = "nej" %> <html> <head> </head> <body> Du er nu logged ud.
<!-- Disse linier kan du fjerne efter dine tests: //--> <br><br> <a href='login.asp'>Login</a>
<!-- </body> og </html> skal ikke fjernes, men denne kommentar kan fjernes: //--> </body> </html>
**********
*** protection.asp (checker om brugeren er logget ind) ***
<% response.buffer = false if Session("login") <> "ja" then ' hvis du ikke vil vise en besked, men sende brugeren til login siden med det samme, ' fjerner du bare ' tegnet: ' response.redirect "login.asp"
' du har valgt at vise denne besked: %> <html> <head> </head> <body> Du skal <a href="login.asp?url=<% response.write Request.ServerVariables("SCRIPT_NAME")%>">logge ind</a> før du kan se denne side. </body> </html> <% ' Udskriv ikke mere til browseren: response.end end if %>
**********
*** userpass.asp (indeholder brugernavne og passwords) ***
<% ' Sådan virker denne fil: ' Når du vil lave almindelige kommentarer, bruger du: ' ' Når du indsætter brugernavn og password, bruger du: '* (uden mellerum i starten af linien)
' hvis brugeren indtaster addressen på denne fil, ' sendes han videre til login.asp: response.redirect "login.asp" %>
**********
*** page1.asp (eksempel på dine sider) ***
<!-- #include file="protection.asp" //--> <html> <head> </head> <body> denne side er beskyttet af login. du kan læse denne side fordi du er logget ind. <br> <br> Der er ikke meget at lave på denne tomme side, så du kan bare <a href="logout.asp">Logge ud</a>, og prøve det hele igen. </body> </html>
Når brugeren er logget ind, og er kommet til login siden via en beskyttet side, sendes han tilbage til denne. Dette sker via urlen, som på den beskyttede side, kommer til at indeholde "?url=X", hvor X er addressen på den beskyttede side..
Jeg ved ikke om denne del er en sikkerhedsrisiko, idet urlen kan modificeres til at sende til et andet sted..
Jeg havde følgende server variabler tilrådehed: PATH_INFO SCRIPT_NAME URL
..og brugte SCRIPT_NAME.
Måske kan en af de andre asp programmører kommentere dette.
hmm... man kunne jo bruger InStrRev (In String Reverse, starter fra slutningen af strengen), finde positionen af "/", og derved finde filnavnet (page1.asp).. men det virker som det er nu..
Det ville nok være en god ide at validere så man ikke får "*-_:;?)(/&%" tegn med som brugernavn eller password.. der er vist en eller anden nem måde at gøre det på.. kan dog ikke lige huske hvordan det er.. tror eagleeye brugte den engang..
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.