timediaMedlem sedan maj 2001420 inlägg Man kan idag ge eget betyg på en film. Hur säkrar jag upp denna kod emot sql-injects? Betyget baseras på terningen, 1 - 6 i heltal.
<%
Set RecSet = Server.CreateObject("ADODB.Recordset")
Uppdatera = "SELECT * FROM Recension WHERE ID = " & Request.Form("AD") & " "
zeroval = Request.Form("R1")
If zeroval = 0 Then
Response.Write "Ogiltig röst."
Else
RecSet.Open Uppdatera, Connect, adOpenStatic, adLockOptimistic
RecSet("Addvote") = Request.Form("R1") + RecSet("Addvote")
RecSet("Votes") = RecSet("Votes") + 1
RecSet.Update
RecSet.Close
Connect.Close
Response.Cookies("Moviebetyg") = Request.Form("AD")
Response.Cookies("Moviebetyg").Expires = Date+1
Response.Cookies("Moviebetyg").Domain = ".www.moviemix.nu"
Response.Write "<b>Tack!</b><br>"
Response.Write "<scr" & "ipt>self.close();</scr" & "ipt>"
End If
End If
%>
LedelMedlem sedan dec. 2004736 inlägg Uppdatera = "SELECT * FROM Recension WHERE ID = " & Request.Form("AD") & " "
Eftersom att AD är ett heltal så bör du anropa CInt med AD som parameter:
Uppdatera = "SELECT * FROM Recension WHERE ID = " & CInt(Request.Form("AD"))
Detta konverterar AD till ett heltal, och om det innehåller text ( = trolig SQL Injection) visas ett felmeddelande som säger att AD inte kunde omvandlas till ett heltal.
@ndersMedlem sedan juni 200032 969 inlägg CInt är ett dåligt alternativ - gränsen för integer är väldigt låg. Använd CLng istället.
Se också till att byta ut alla apostrofer mot två.
timediaMedlem sedan maj 2001420 inlägg tack för tipsen!
Behöver man inte också säkra så att alla värden större än 6 och mindre än noll plockas bort?
I dag finns filmer med betyg 0,87 - det ska ju inte vara möjligt när minsta betyget är 1.
LedelMedlem sedan dec. 2004736 inlägg I så fall får du spara CInt(Request.Form("AD)) i en variabel och sedan kolla att värdet ligger inom de gränser du angett.
rille77Medlem sedan feb. 200476 inlägg Vet knappt vart jag sak börja, för det första skrota ditt recordset, när du ska göra en uppdatering så behövs det inte överhuvudtaget.
Gör det direkt i SQL istället.
Connect.Execute("UPDATE Recension SET Addvote = Addvote + zeroval, Votes = Votes + 1 WHERE ID = " & Request.Form("AD") & "")
Sådär nu sparade vi 7 rader kod på en gång.
zeroval används istället för Request.Form("R1") iom att du har tilldelat zeroval värdet i Request.Form("R1") tidigare, att anropa Request igen tar bara onödig kraft.
Att du får 0,87 som betyg är inte alls konstigt då man kan skicka in en 0 röst.
If zeroval = 0 Then
zeroval kommer aldrig vara = 0, du jämför nämligen 0 med "0" iom att du inte typomvandlar zeroval till ett tal.
En enkel kod för att utföra det du vill ser ut såhär, då är den även skyddad mot SQL injections.
<%
AdID = CLng(Request.Form("AD"))
zeroval = CLng(Request.Form("R1"))
If zeroval = 0 Then
Response.Write "Ogiltig röst."
Else
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Execute("UPDATE Recension SET Addvote = Addvote + zeroval, Votes = Votes + 1 WHERE ID = "& AdID &"")
Connect.Close : Set Connect = Nothing
Response.Cookies("Moviebetyg") = Request.Form("AD")
Response.Cookies("Moviebetyg").Expires = Date+1
Response.Cookies("Moviebetyg").Domain = ".www.moviemix.nu"
Response.Write "<b>Tack!</b><br>"
Response.Write "<scr" & "ipt>self.close();</scr" & "ipt>"
End If
%>
Skydd mot SQL injections är beroende på databas, MySQL och Access har olika.
Ska du ha ett 100% skydd så är det parametrar som gäller.
Kort kan man säga att se alltid till att typomvandla tal och se till att din databasspecifika tecken escapas korrekt
@ndersMedlem sedan juni 200032 969 inlägg Litet tillägg: zeroval måste konkateneras in i SQL-frågan.
Connect.Execute("UPDATE Recension SET Addvote = Addvote + " & zeroval & ", Votes = Votes + 1 WHERE ID = "& AdID)
Och - det finns ingen anledning att konkatenera in en tom sträng i slutet.