webForumDet fria alternativet

Testa säkerheten !

Webbutveckling

7 svar · 408 visningar · startad av Mog

Medlem sedan nov. 2003266 inlägg
Frågan#1

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

Medlem sedan feb. 2003202 inlägg
#2

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.

Medlem sedan nov. 2003266 inlägg
#3

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.

Medlem sedan dec. 19992 555 inlägg
#4

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).

Medlem sedan nov. 2003266 inlägg
#5

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 %>
Medlem sedan dec. 19992 555 inlägg
#6
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).

Medlem sedan nov. 2003266 inlägg
#7

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?

Medlem sedan dec. 19992 555 inlägg
#8

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.

268 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)