![]() |
validera kod för att hindra sql-injections
Hej,
förslag på hur jag ska validera följande kod för att hindra sql-injections? <% response.buffer = true ' Uppdaterar klick och skickar vidare till url Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open "Driver={MySQL ODBC 5.1 Driver};" & "Server=mysql443.loopia.se;" & "Port=3306;" & "Option=131072;" & "Stmt=;" & "Database=mindatabas;" & "Uid=anvandare;" & "Pwd=mittlosenord" If Request.QueryString("id") <> "" Then Set rs = Server.CreateObject("ADODB.RecordSet") strSQL = "SELECT * FROM links WHERE (ID = " & Request.QueryString("id") & ")" rs.Open strSQL, myConn, 1, 3 If Not (rs.BOF Or rs.EOF) Then rs("Hits") = rs("Hits") + 1 strURL = rs("URL") rs.Update rs.Close myConn.Close Set rs = Nothing Set myConn = Nothing Response.Clear strid = Request.QueryString("ID") %> |
<% response.buffer = true
strid = int(Request.QueryString("ID")) ' Uppdaterar klick och skickar vidare till url Set myConn = Server.CreateObject("ADODB.Connection") myConn.Open "Driver={MySQL ODBC 5.1 Driver};" & "Server=mysql443.loopia.se;" & "Port=3306;" & "Option=131072;" & "Stmt=;" & "Database=mindatabas;" & "Uid=anvandare;" & "Pwd=mittlosenord" If strid <> "" Then Set rs = Server.CreateObject("ADODB.RecordSet") strSQL = "SELECT * FROM links WHERE (ID = " & strid & ")" rs.Open strSQL, myConn, 1, 3 If Not (rs.BOF Or rs.EOF) Then rs("Hits") = rs("Hits") + 1 strURL = rs("URL") rs.Update rs.Close myConn.Close Set rs = Nothing Set myConn = Nothing Response.Clear %> |
I PHP finns mysql_real_escape_string / PDO med prepared statements. Det måste väl finnas i ASP också?
|
Citat:
|
Citat:
|
Citat:
Kolla tråden Funky Functions in ASP på Sitepoint. http://www.sitepoint.com/forums/show...ctions-in-ASP/ http://www.sitepoint.com/forums/show...ape#post312576 |
Citat:
Koden ser väl ut ungefär såhär: Kod:
set command = Server.CreateObject("adodb.command") |
Tack!
Vet att jag kanske borde byta bort de gamla asp-filerna till något nytt, men tänkte fixa detta säkerhetshål tillsvidare. Är det bara att lägga till strid inför alla databasfrågor i de andra asp-filerna till samma script eller hur skulle följande fil i samma script valideras? t.ex. <% Set db = Server.CreateObject("ADODB.Connection") db.Open "Driver={MySQL ODBC 5.1 Driver};" & "Server=mysql443.loopia.se;" & "Port=3306;" & "Option=131072;" & "Stmt=;" & "Database=dagligen_se;" & "Uid=anvandare;" & "Pwd=mittpass" SQL = "SELECT Count(*) AS rakna From links WHERE visa='ja' AND datum<='" & date()-1 & "'" Set rs = db.Execute(SQL) rakna = RS.Fields(0) rs.Close db.Close %> <td bgcolor=#FFFFFF width=568 valign=top> <center> <table width="548" cellspacing=0 cellpadding=0> <tr> <td valign=top> <br> Här hittar du alla länkar som visas just nu på Dagligen.nu.<br> Just nu finns det <%=rakna%> länkar. <br> <a class="kat" href="alla.asp?lista=alla">Alla</a> | <a class="kat" href="alla.asp?lista=film">Filmer</a> | <a class="kat" href="alla.asp?lista=bild">Bilder</a> | <a class="kat" href="alla.asp?lista=hemsida">Hemsidor</a> | <a class="kat" href="alla.asp?lista=spel">Spel</a> | <a class="kat" href="alla.asp?lista=ljud">Ljud</a> <br> </td> </tr> </table> <% Dim Con Set Con = Server.CreateObject("ADODB.Connection") Con.Open "Driver={MySQL ODBC 5.1 Driver};" & "Server=mysql443.loopia.se;" & "Port=3306;" & "Option=131072;" & "Stmt=;" & "Database=dagligen_se;" & "Uid=minanvandare;" & "Pwd=mittpass" %> <% Const perSida = 50 Dim sida If Request.QueryString("sida") = "" then sida = 1 Else sida = Request.QueryString("sida") End If Dim RecSet Set RecSet= Server.CreateObject("ADODB.Recordset") RecSet.CursorLocation = adUseClient RecSet.CacheSize = perSida %> <% visning = Request.QueryString("lista") If Request.QueryString("lista") = "alla" then SQLSats = "select * from links WHERE visa='ja' AND datum<='" & date()-0 & "' ORDER BY datum DESC" else SQLSats = "select * from links WHERE visa='ja' AND datum<='" & date()-0 & "' AND typ='" & visning & "' ORDER BY datum DESC" end if RecSet.Open SQLSats, Con If RecSet.EOF Then Response.Write"<i>Inga länkar hittades!</i>" Else RecSet.MoveFirst RecSet.PageSize = perSida Dim TotalPages TotalPages = RecSet.PageCount RecSet.AbsolutePage = sida Dim count %> <table width="540" border=0 cellspacing="0" cellpadding=0> <% Count = 0 Do While Not RecSet.EOF And Count < RecSet.PageSize Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "Driver={MySQL ODBC 5.1 Driver};" & "Server=mysql443.loopia.se;" & "Port=3306;" & "Option=131072;" & "Stmt=;" & "Database=dagligen_se;" & "Uid=minanvandare;" & "Pwd=mittpass" If farve=1 Then bg="#FFFFFF" Farve= Farve + 1 Else bg="#F1F1F1" farve=1 End If %> <tr bgcolor="<%=bg%>"> <td height="18" valign="top" align="left" width="80"> <%=RecSet("datum")%> </td> <td height="18" valign="top" align="left" width="18"> <img src="gfx/<%=RecSet("typ")%>.gif"> </td> <td height="18" valign="top" width="230"> <a class="kat" href="links.asp?ID=<%=RecSet("ID")%>" target="_blank"><% strText=RecSet("navn") If Len(strText) > 30 Then Response.Write(Left(strText,30) & "..") Else Response.Write(strText) End If %> </a></b><br> </td> <td width="100"> <% idr=RecSet("ID") Set db = Server.CreateObject("ADODB.Connection") db.Open "Driver={MySQL ODBC 5.1 Driver};" & "Server=mysql443.loopia.se;" & "Port=3306;" & "Option=131072;" & "Stmt=;" & "Database=dagligen_se;" & "Uid=mittlosen;" & "Pwd=mittpass" SQL = "SELECT Count(*) AS kommentarer From kommentarer WHERE idx='" & idr & "' AND visa='ja'" Set rs = db.Execute(SQL) kommentarer = RS.Fields(0) rs.Close db.Close %> <a class="green" href="kommentera.asp?ID=<%=RecSet("ID")%>">Komment era</a> <a class="green" href="kommentera.asp?ID=<%=RecSet("ID")%>">(<%=kom mentarer%>)</a> </td> </tr> <% Count = Count + 1 RecSet.MoveNext Loop RecSet.Close Set RecSet = Nothing %> <br> <tr> <td colspan="4"> <% If TotalPages <> "1" Then Dim Pages For Pages = 1 To TotalPages %> <b><a href="alla.asp?lista=<%=visning%>&sida=<%=Pages%>" ><%=Pages%></a> <%Next%> </b> <%end if%> </td> </tr> </table> <%end if%> Eller någon som kan tänka sig att titta på hela scriptet (ca 10 asp-filer) och validera dem i utbyte mot en länk från någon relevant sida? |
Citat:
Det är parameteriserad ADO du menar, det är det sättet man ska använda i alla anrop. Man ska dessutom aldrig lägga någon annan aktiv kod i en webbsida än anrop till förkompilerade moduler (Code-behind) i ASPX och även i gammal ASP ska man kompilera sina SQL-satser i egna klass-komponenter och sedan enbart göra själva anropet i ASP-sidan. När man använder parameteriserad ADO så är skyddet mot SQL-injections inbyggt så man behöver inte göra något mer. Detta är en teknik som använts i minst 10 år så det finns ingen ursäkt att köra på med den gamla stilen att skriva aktiv kod i ASP eller ASPX-sidorna. Här är lite exempel på syntaxen: http://www.w3schools.com/ado/met_com...eparameter.asp |
Citat:
Använd code-behind och förkompilera i komponenter i stället, Skriv ALDRIG SQL-kod i en ASP eller ASPX-sida, lägg ALL SQL-kod i DLL-er. |
Jo, är som sagt väldigt gammal och inte jag som skrivit det och visst borde hela scriptet bytas ut, men tänkte säkra upp de värsta säkerhetsmissarna innan dess...
|
Citat:
|
Instämmer med ConnyWesth. Det är en del knappande om koden är skriven som man gjorde förr men använder man en klass eller separat komponent så blir det relativt enkelt och framför allt lätt att hantera. Jag har gjort det så jag vet hur jäkla jobbigt och frustrerande det kan kännas men det är faktiskt värt det i slutändan.
|
Alla tider är GMT +2. Klockan är nu 08:43. |
Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson