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 :)
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
%>
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" -->
<!-- #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
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
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 :)
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?
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 :)
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.
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å.
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.
271 ms totalt · 3 externa anrop · v20260731065814-full.265f3fdd