<%
if Request.Form("in") = "stig in" Then 'vill användaren logga in?
Set minCon = Server.CreateObject( "Adodb.Connection" )
minCon.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("\spif93\db\guests.mdb")
strUser = Request.Form("Anamn")
strPasw = Request.Form("pword")
strSQL = "SELECT* FROM admin WHERE anvnamn='"& strUser &"'"
Set User = minCon.Execute(strSQL)
strSQL ="SELECT* FROM admin WHERE password ='" & strPasw & "'"
Set Losen = minCon.Execute(strSQL)
If User.EOF Then
Response.Redirect("fel_anv.html")
End IF
If Losen.EOF Then
Response.Redirect("fel_passw.html")
End If
If NOT User.EOF AND NOT Losen.EOF Then
Session("Inloggad") = "Ja"
Set User = Nothing
Set Losen = Nothing
strSQL ="SELECT * FROM admin WHERE password = '" & Request.Form("pword")&"'"
Set Fornamn = minCon.Execute(strSQL)
While NOT Fornamn.EOF
Response.Write "<p align=center><font size=7><b><i><font color=#FFCC33 SIZE=""+3"">"
Response.Write "Nu kan du " & Fornamn("Fnamn")
Response.Write " redigera gästboken!"
Fornamn.MoveNext
Wend
Set Fornamn = Nothing
%>
Använd parameteriserade frågor eller en function för att plocka bort farliga tecken.
function SQLEncode(str)
SQLEncode = replace(str,"'","''")
End function
strSQL = "SELECT* FROM admin WHERE anvnamn='"& SQLEncode(strUser) &"'"
Set User = minCon.Execute(strSQL)
strSQL ="SELECT* FROM admin WHERE password ='" & SQLEncode(strPasw) & "'"
'osv
Inte bara SQL-injections som kan ställa till det här. Med den koden så behöver man fylla i ett användarnamn som finns och ett lösenord som finns. Dock behöver de inte finnas på samma användare...
strSQL ="SELECT * FROM admin WHERE password = '" & Request.Form("pword")&"'"
Set Fornamn = minCon.Execute(strSQL)
Vad händer om flera användare har samma lösenord!? Då vet inte koden vilket förnamn som ska hämtas.
Är lösenorden unika så är koden ok annars bör du lägga till användarnamnet också i selecten (för användarnamnet är väl unikt!?):
strSQL ="SELECT * FROM admin WHERE anvnamn='"& strUser &"' and password = '" & strPasw & "' "
Set Fornamn = minCon.Execute(strSQL)
Jo, om du t.ex har en sida som du inte vill kolla inloggning på så måste du ta bort inkluderingen av din fil: koll.inc och detta blir jobbigt att komma ihåg hela tiden, inkludera eller inte inkludera.
Gör du som jag skrev så kan du inkludera filen på alla sidor och sedan kalla på subben på de sidor du vill spärra.
Detta blir väldigt användbart när du börjat samla på dig en massa div. funktioner och subbar. Återanvändning av kod kallas det! :)
tack doggelito för att du delar med dig av din kunskap och erfarenhet
Alltid roligt att kunna hjälpa till! :)
Dina frågor:
1. Ja, eftersom det är en helt vanlig inkluderad fil. Dock vissa webbhotell tillåter inte att man länkar via "include file" utan bara med "include virtual".
2. Japp!
3. Korrekt!
Varför man döper filen till .asp och inte .inc är för att skydda innehållet i filen.
En .inc går att ladda ner och sedan öppna i sin textredigerare. :)
Man kan väl säga så här när det gäller subbar och funktioner:
Allt som du skriver mer än en gång gör du om till en sub eller function och anropar istället! (lite överdrivet kanske, men ändå)
Återanvända kod är något man alltid ska sträva efter.
En .inc går att ladda ner och sedan öppna i sin textredigerare.
Oftast inte nuförtiden. Det är väl bara på ofixade installationer av IIS4 man behöver oroa sig om det. Jag förordar dock också filändelsen .asp, och en placering av includefiler i en egen mapp istället.