JeppewebMedlem sedan sep. 2006462 inlägg 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 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
%>
'# 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 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 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 JeppewebMedlem sedan sep. 2006462 inlägg <!-- #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
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
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 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 Jag vill minnas att jag postade en rekommendation i denna tråd...
JeppewebMedlem sedan sep. 2006462 inlägg Läst. Den ger ju inge tips om smart login ..
headbugMedlem sedan sep. 2006867 inlägg 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
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.
TroxyMedlem sedan mars 20041 505 inlägg 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
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 <!-- #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 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 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.