webForumDet fria alternativet

SQL Injections

22 svar · 1 313 visningar · startad av Jeppeweb

JeppewebMedlem sedan sep. 2006462 inlägg
#1

Hur fungerar det? Hur skyddar jag mig som bäst mot alla tänkbara säkerhetshål som kan tänkas finnas på en sajt med ASP + Mysql ?

Söker jag nu på min sida på t.ex " ' " får jag detta felmeddelande;

Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[MySQL][ODBC 3.51 Driver][mysqld-5.0.21-log]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%' Order by online DESC' at line 1

/sok.asp, line 80

betyder det att jag är ganska illa ute? Har googlat lite men inte hittat det jag direkt söker..

Edit*: Enkla sätt att försöka "hacka" sin sida på ? Så man kan kolla om den håller måttet dvs :)

Tacksam för hjälp

JeppewebMedlem sedan sep. 2006462 inlägg
#2

Vad skulle jag t.ex kunna göra för att få koden nedan att bli säker?

<% If Request.QueryString("action")	= "login"	Then %><!-- #include file="databaskopplingar.asp" --><% 
	SQL = "Select * from medlemmar"
	Set RecSet = Connect.execute(SQL)

	X = FALSE

	Do Until X = TRUE OR RecSet.EOF

		If RecSet("anvandarnamn") = Request.Form("Username") Then
			X = TRUE
			Exit Do
		End If

	RecSet.MoveNext

	Loop

	If X = TRUE Then

		Y = FALSE
		Do Until Y = TRUE OR RecSet.EOF

		If RecSet("losenord") = Request.Form("Password") Then
		Y = TRUE
		Exit Do
		End If

		RecSet.MoveNext

		Loop

	End If

	If X = FALSE Then 
		Session("msg") = "Du har anget ett felaktigt användarnamn eller lösenord!"
		response.redirect "menu.asp"
	ElseIf Y = FALSE Then
		Session("msg") = "Du har anget ett felaktigt användarnamn eller lösenord!"
		response.redirect "menu.asp"
	End If

	If X = TRUE AND Y = TRUE Then 
if RecSet("online") = "3" then
	Session("msg") = "Ditt konto är avstängt! Om du har klagomål eller annat kontakta crew per e-mail: admin@hejkompis.be "
	RecSet.Close
	Connect.Close
	response.redirect "main.asp"
else
	if RecSet("aktiverad") = "0" then
		Session("msg") = "Ditt konto är inte aktiverat! Om du ej fått något mail så kontakta admin genom att klicka på länken länst ner till höger på sidan! <br><br>"
		RecSet.Close
		Connect.Close
		response.redirect "main.asp"
	else
	
		Session("cmid") = RecSet("id")
		Session("cmanvandarnamn") = RecSet("anvandarnamn")
    	Session("cmalias") = RecSet("alias")
		Session("cminloggad") = "ja"
		antalinlogg = RecSet("inloggningar") + 1
		status = RecSet("status") + 1
		online = "1"
		senastip = Request.ServerVariables("REMOTE_ADDR")
		senastdatum = Now
		
		Connect.Execute("update medlemmar set inloggningar = '"&antalinlogg &"', status = '"&status &"', online = '"&online&"', senastip = '"&senastip&"', senastdatum = '"&senastdatum&"' WHERE ID = " & RecSet("id") & "")
		Connect.Execute("INSERT INTO iplogg (ip,datum,vems) VALUES('"& senastip &"','"& senastdatum &"','"& Session("cmid") &"')")

		RecSet.Close
		Connect.Close
end if
end if
    End If 
    
end if
%>
medialabsMedlem sedan mars 20023 686 inlägg
#3
	'# Funktion för att Escapa apostrof och backslash 

		Function SafeSQL(strText)
    			SafeSQL = Replace(Replace(strText, "\", "\\"), "'", "\\'")
		End Function

och sedan

SafeSQL(Request.Form("Username"))
SafeSQL(Request.Form("Password"))

till att börja med.

LadytronMedlem sedan feb. 2005248 inlägg
#4

Varför använder du ett sånt oerhört invecklat system för att logga in? Den där koden skulle kunna vara på några rader om du hade sökt efter poster i tabellen som matchade det användaren har skrivit in.

Detta fungerar inte heller eftersom SSI körs innan ASP-koden:

<% If Request.QueryString("action")	= "login"	Then %><!-- #include file="databaskopplingar.asp" -->
JeppewebMedlem sedan sep. 2006462 inlägg
#5

tips på hur ett bättre, snabbare o säkrare login script skulle kunna se ut då? :)

Peter SMedlem sedan dec. 20025 483 inlägg
#6

Se emissions inlägg i http://www.webforum.nu/showthread.php?t=147929.

JeppewebMedlem sedan sep. 2006462 inlägg
#7
<!-- #include file="databaskopplingar.asp" -->
<% If Request.QueryString("action")	= "login"	Then

SQL = "SELECT * FROM medlemmar WHERE anvandarnamn = '" & Request.Form("anvandarnamn") & "' AND losenord = '" & Request.Form("Password") & "'"
Set RecSet = Connect.execute(SQL)

If not RecSet.Eof then

		Session("cmid") = RecSet("id")
		Session("cmanvandarnamn") = RecSet("anvandarnamn")
    	Session("cmalias") = RecSet("alias")
		Session("cminloggad") = "ja"
		antalinlogg = RecSet("inloggningar") + 1
		status = RecSet("status") + 1
		online = "1"
		senastip = Request.ServerVariables("REMOTE_ADDR")
		senastdatum = Now
		
		Connect.Execute("update medlemmar set inloggningar = '"&antalinlogg &"', status = '"&status &"', online = '"&online&"', senastip = '"&senastip&"', senastdatum = '"&senastdatum&"' WHERE ID = " & RecSet("id") & "")
		Connect.Execute("INSERT INTO iplogg (ip,datum,vems) VALUES('"& senastip &"','"& senastdatum &"','"& Session("cmid") &"')")
Else
    'Gör annat
    Session("msg") = "Du har anget ett felaktigt användarnamn eller lösenord!"
    response.redirect "menu.asp"
    
end if
End if
%>
  		  <script language="JavaScript">
<!--
top.location.href="index.asp"; 
// -->
          </script>
<form name="form3" method="POST" action="login.asp?action=login" onSubmit="return checkForm(this)">
  		  <span class="Hline1">Inloggning</span>
  		  <br>
  		  <br>Användarnamn
  		  <br><input type="text" name="username" class="2" size="20">
  		  <br>
  		  <br>Lösenord
  		  <br><input type="password" name="password" class="2" size="20">
  		  <br>
  		  <br>
  		  <input name=submit type=submit value='Logga in' class=Inputsubmit>
  		  

  		  </form>

Vad är det som fattas för att få det här att fungera om man tittar på min tidigare login kod? Tänkte först gör jag om login scriptet, sedan fixar säkerheten eftersom jag fått så mycket kritik mot just min kod :P

Oerhört tacksam för hjälp!

spangoMedlem sedan juni 20008 205 inlägg
#8

Jeppeweb skrev:

tips på hur ett bättre, snabbare o säkrare login script skulle kunna se ut då? :)

Steg 1: Läs inte Webstudios ASP-tutorial
Steg 2: Läs t.ex. http://www.webforum.nu/showthread.php?t=120902 och begrunda
Steg 3: Använd bara prepared statements (alias parametriserade frågor)

red. Oj, insåg inte riktigt vilken flamefest tråden ovan urartade till. Men vi låter länken vara kvar och tar det som ett varnande exempel - Webstudios ASP-skola mördar freden

CompusaMedlem sedan jan. 20023 327 inlägg
#9

spango skrev:

red. Oj, insåg inte riktigt vilken flamefest tråden ovan urartade till. Men vi låter länken vara kvar och tar det som ett varnande exempel - Webstudios ASP-skola mördar freden

Hmm ja, den tråden visar nog mer att det kan löna sig att vara ödmjuk, även på internet-forum :e

På övriga punkter håller jag dock med dig till fullo :)

JeppewebMedlem sedan sep. 2006462 inlägg
#10

Okej, jag är nybörjare. Vad är "prepared statements" Sökte men fick inte så mkt träffar.. Någon kodgrund som man skulle kunna bygga på som både är säker o smart?

Peter SMedlem sedan dec. 20025 483 inlägg
#11

Jag vill minnas att jag postade en rekommendation i denna tråd...

JeppewebMedlem sedan sep. 2006462 inlägg
#12

Läst. Den ger ju inge tips om smart login ..

headbugMedlem sedan sep. 2006867 inlägg
#13

Jo det gör den fast den kräver att du själv är tillräckligt kunnig i ämnet för att kunna appliceras på ditt problem. Det finns sålunda två sätt att ställa frågor här - frågor som hjälper dig att förstå hur man löser en TYP av problem, sådana svar har du fått många. Sen finns det frågor och frågare som inte orkar lära sig sakerna utan bara vill ha svaret och snabbt skall det gå - sådana svar får man ganska sällan i sådana här forum för i princip innebär det att någon annan gör hela din utveckling. Så min rekomendation är att du tar alla vänliga svar och faktiskt försöker förstå hur talarna ovan menar när dom säger att dom hjälpt dig redan. Annars finns risken att du blir känd som killen som man inte orkar hjälpa för det tar aldrig slut, typ. Och det vill du ju inte :)

TroxyMedlem sedan mars 20041 505 inlägg
#14

Jeppeweb skrev:

Läst. Den ger ju inge tips om smart login ..

Principen för att bygga en någonlunda smart login är följande:
1. Spara användarnamn och lösenord i två variabler (som du säkrar från SQL-injections såklart ;))
2. Ställ en SQL-fråga mot databasen i stil med: "Hämta ut alla poster där användarnamn är X och lösenord är X".
3. Kolla med en if-sats om du hittade någon post i databasen (if objLogin.EOF). Om du hittade en post, då är inloggningen rätt, men om resultatet är tomt så är inloggningen fel.

JeppewebMedlem sedan sep. 2006462 inlägg
#15

Kodexempel?

TroxyMedlem sedan mars 20041 505 inlägg
#16

Punkt nummer 1 och 3 klarar du säkert av.
Men SQL-frågan ser väl ut ungefär såhär, beroende på tabellens struktur.

SELECT username,password,osv,osv FROM usertable WHERE username='användarnamn' AND password = 'lösenord'
LadytronMedlem sedan feb. 2005248 inlägg
#17

Jeppeweb skrev:

Kodexempel?

Du har redan fått exempel på punkt 1 som Troxy skrev. Exempel på punkt 2 och 3 finns i koden du postade ovan. Du har även fått en förklaring på hur du sätter ihop det. Jag är rädd att du inte kan få det mer serverat än så.

JeppewebMedlem sedan sep. 2006462 inlägg
#18
<!-- #include file="databaskopplingar.asp" -->
<% If Request.QueryString("action")	= "login"	Then

SELECT case username, password FROM usertable WHERE username='anvandarnamn' AND password = 'losenord'

if objLogin.EOF then

		Session("cmid") = RecSet("id")
		Session("cmanvandarnamn") = RecSet("anvandarnamn")
    	Session("cmalias") = RecSet("alias")
		Session("cminloggad") = "ja"
		antalinlogg = RecSet("inloggningar") + 1
		status = RecSet("status") + 1
		online = "1"
		senastip = Request.ServerVariables("REMOTE_ADDR")
		senastdatum = Now
		
		Connect.Execute("update medlemmar set inloggningar = '"&antalinlogg &"', status = '"&status &"', online = '"&online&"', senastip = '"&senastip&"', senastdatum = '"&senastdatum&"' WHERE ID = " & RecSet("id") & "")
		Connect.Execute("INSERT INTO iplogg (ip,datum,vems) VALUES('"& senastip &"','"& senastdatum &"','"& Session("cmid") &"')")
Else
    'Gör annat
    Session("msg") = "Du har anget ett felaktigt användarnamn eller lösenord!"
    response.redirect "menu.asp"
    
end if
End if
%>
  		  <script language="JavaScript">
<!--
top.location.href="index.asp"; 
// -->
          </script>
<form name="form3" method="POST" action="login.asp?action=login" onSubmit="return checkForm(this)">
  		  <span class="Hline1">Inloggning</span>
  		  <br>
  		  <br>Användarnamn
  		  <br><input type="text" name="username" class="2" size="20">
  		  <br>
  		  <br>Lösenord
  		  <br><input type="password" name="password" class="2" size="20">
  		  <br>
  		  <br>
  		  <input name=submit type=submit value='Logga in' class=Inputsubmit>
  		  

  		  </form>

Microsoft VBScript compilation error '800a0400'

Expected statement

/login.asp, line 4

SELECT case username,password FROM usertable WHERE username='anvandarnamn' AND password = 'losenord'
--------------------^

emissionMedlem sedan dec. 19996 721 inlägg
#19

Nu tappade du själva exekveringen av SQL:en. Man kan inte lägga SQL mitt i VBScript. Det var rätt i tidigare exempel.

CompusaMedlem sedan jan. 20023 327 inlägg
#20

Jeppeweb vill att hans script ska bli säkrare och jag tycker det känns som hans tillvägagångssätt är den största säkerhetsrisken. Mitt tips är att du lär dig programmera först! Det känns som du bara gör "copy and paste" på all kod som du får här och sedan inte har en aning om vad det är du sysslar med.

Jag vet att alla är nybörjare en gång men jag tycker dina inlägg tyder på att du har stora brister i dina kunskaper. Om du inte redan har en bra bok så tycker jag du ska skaffa dig det. Allt blir så mycket enklare om du ägnar lite mer tid till att läsa på om tekniken och verkligen förstå vad det är du gör osv.

Visst du kan ignorera detta inlägget om du vill, men du kommer aldrig kunna skriva säkra saker med 'copy-and-paste' metoden. Om man inte vet vad man gör så är det omöjligt att få något säkert.

135 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
132 ms — hämta tråd, inlägg och bilagor (db)