Jag kom inte in iallfall! ;)
Så länge du inte lägger in värdena från inputfälten direkt i SQL-strängen är du hyfsat säker. Tänk även på att konvertera/ta bort eventuella ' och " tecken i de inmatade strängarna.
7 svar · 408 visningar · startad av Mog
Kanske skulle varit i "Kolla min hemsida"... men nu blir det här.
Jag har en inloggningsfunktion på hemsidan där man ska kunna administrera sajten och jag skulle vilja ha lite hjälp att testa säkerheten.
Jag har läst en del om t.ex. SQL-injections här på WF och det verkar finnas personer som kan betydligt mer än jag på det området.
Är det någon som kommer in på Admin-sidorna eller har jag lyckats göra dem hyfsat säkra?
mogges.se
Jag kom inte in iallfall! ;)
Så länge du inte lägger in värdena från inputfälten direkt i SQL-strängen är du hyfsat säker. Tänk även på att konvertera/ta bort eventuella ' och " tecken i de inmatade strängarna.
andreascarlsson skrev:
Så länge du inte lägger in värdena från inputfälten direkt i SQL-strängen är du hyfsat säker. Tänk även på att konvertera/ta bort eventuella ' och " tecken i de inmatade strängarna.
Än så länge gör jag faktiskt det, hämtar värdena direkt alltså och utan att konvertera bort nånting. Tänkte att man skulle ha möjlighet att använda vilka tecken man vill som lösenord.
Nuvarande lösenord har dock inga andra tecken än bokstäver.
Tack för att du misslyckades :e
Ska bli spännande att se om nån annan kan.
Vill du ha en någorlunda seriös säkerhetsgranskning så bör du få någon/några att gå igenom själva källkoden för att leta efter brister. Att sitta och prova olika saker på måfå är slöseri med tid som jag ser det (och jag förstår inte riktigt vitsen -- finns ingenting som säger att din kod är säker, oavsett hur många som misslyckas att ta sig in).
Ok, här kommer lite kod att kolla.
Detta är den viktiga delen i login.asp.
Funktioner för utskrift av HTML utelämnade.
<%
If (Request.Querystring("action") = "login") Then
Dim username, password
username = Request.Form("user")
password = Request.Form("passwd")
If (checkPassword() = 0) Then
setSession()
Response.Redirect("main.asp?page=Admin")
Else
printHeader()
error("Användarnamn eller lösenord är felaktigt!")
printFooter()
End If
' Om inloggad, skicka vidare till admin-sidorna
ElseIf (Request.Cookies("loggedIn@mogges").haskeys AND _
Session("loggedIn@mogges") = Request.Cookies("loggedIn@mogges")("UserName")) Then
Response.Redirect("admin/index.asp")
' Skriv ut inloggningsformuläret
Else
printHeader()
printForm()
printFooter()
End If
%>
<%'#######################################'%>
<% Function checkPassword() %>
<!--#include virtual="/../sys/db_con.asp"-->
<%
On Error Resume Next
' Funderar på att kolla efter ' och " innan frågan körs
SQLstr = "SELECT password FROM Users WHERE username = '" & username & "'"
rs.Open SQLstr, cn
If (Err.Number = 0 AND NOT rs.EOF) Then
If NOT (password = rs("password")) Then
checkPassword = 1
End If
Else
checkPassword = 1
End If
Err.Clear
rs.close
Set rs=nothing
cn.close
Set cn=nothing
End Function %>
<%'#######################################'%>
<% Function setSession() %>
<!--#include virtual="/../sys/db_con.asp"-->
<%
SQLstr = "SELECT username, name, group FROM Users WHERE username = '" & username & "'"
rs.Open SQLstr, cn
Session("loggedIn@mogges") = rs("username")
Session("group@mogges") = rs("group")
Response.Cookies("loggedIn@mogges")("UserName") = rs("username")
Response.Cookies("loggedIn@mogges")("Name") = rs("name")
rs.close
Set rs=nothing
cn.close
Set cn=nothing
End Function %>
På varje sida i admin-katalogen står detta:
<% If (Request.Cookies("loggedIn@mogges").haskeys AND _
Session("loggedIn@mogges") = Request.Cookies("loggedIn@mogges")("UserName")) Then %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
.
.
.
.
</BODY>
</HTML>
<% End If %>
Session("loggedIn@mogges") = rs("username") Session("group@mogges") = rs("group") Response.Cookies("loggedIn@mogges")("UserName") = rs("username") Response.Cookies("loggedIn@mogges")("Name") = rs("name")<% If (Request.Cookies("loggedIn@mogges").haskeys AND _ Session("loggedIn@mogges") = Request.Cookies("loggedIn@mogges")("UserName")) Then %>
Varför denna omständiga procedur? En sessionvariabel är ju redan unik per besökare, så varför sätta en extra kaka med användarnamnet? Den kakan ökar inte säkerheten som jag ser det. Kan snarare minska den eftersom du ger användaren ännu en möjlighet att peta in data i dina skript (man kan manuellt sätta en kaka och skicka vilket värde man vill i den till servern).
Du har rätt, jag ska ändra det.
Tanken var annars att hämta från en cookie istället för databasen för att jämföra med, tyckte att det skulle vara snabbare.
Men har man satt en session så har man och då ska det inte behövas fler kontroller, eller har jag fel?
Att använda kakor i stället för databas låter inte som någon höjdare, säkerhetsmässigt sett. Användarna kan som sagt skicka tillbaka vad som helst i en kaka. Det har du ingen kontroll över. Lite bättre kontroll har du ju över databasen (om den är säkrad mot SQL injections o.s.v.).
Sessions i IIS använder f.ö. också kakor för att identifiera olika användare.