WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   validera kod för att hindra sql-injections (https://www.wn.se/forum/showthread.php?t=1060583)

jake 2014-01-24 03:45

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")

%>

fabian 2014-01-24 07:22

<% 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

%>

Sony? 2014-01-24 20:25

I PHP finns mysql_real_escape_string / PDO med prepared statements. Det måste väl finnas i ASP också?

fabian 2014-01-25 12:56

Citat:

Ursprungligen postat av Sony? (Inlägg 20485197)
I PHP finns mysql_real_escape_string / PDO med prepared statements. Det måste väl finnas i ASP också?

Nej. Och klassisk ASP är ju outdated så det är inget man borde satsa på...

dAEk 2014-01-28 21:23

Citat:

Ursprungligen postat av fabian (Inlägg 20485222)
Nej.

Jo, det finns visst. Tro det eller ej. :)

fabian 2014-01-29 10:00

Citat:

Ursprungligen postat av dAEk (Inlägg 20485385)
Jo, det finns visst. Tro det eller ej. :)

Jasså? Berätta gärna mer om den?.. Själv har jag byggt egna funktioner på dom sajter som använder klassisk ASP för att hantera detta.

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

dAEk 2014-01-30 19:25

Citat:

Ursprungligen postat av fabian (Inlägg 20485403)
Jasså? Berätta gärna mer om den?..

Det jag syftade på var prepared statements. Vad jag vet har det funnits stöd för dessa länge men få vet om det, antagligen för att det är mest hemmasnickare som fortfarande sitter med asp classic.

Koden ser väl ut ungefär såhär:

Kod:

set command = Server.CreateObject("adodb.command")
command.Prepared = true
command.commandText = "select * from table where column = ?"
command.Parameters.Add(command.CreateParameter...)

recordset.Open(command)

Tyvärr kommer jag inte ihåg den exakta syntaxen men det borde bara vara en sökning bort.

jake 2014-02-06 04:01

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>&nbsp;<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?

Conny Westh 2014-02-06 12:52

Citat:

Ursprungligen postat av dAEk (Inlägg 20485531)
Det jag syftade på var prepared statements. Vad jag vet har det funnits stöd för dessa länge men få vet om det, antagligen för att det är mest hemmasnickare som fortfarande sitter med asp classic.

Koden ser väl ut ungefär såhär:

Kod:

set command = Server.CreateObject("adodb.command")
command.Prepared = true
command.commandText = "select * from table where column = ?"
command.Parameters.Add(command.CreateParameter...)

recordset.Open(command)

Tyvärr kommer jag inte ihåg den exakta syntaxen men det borde bara vara en sökning bort.


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

Conny Westh 2014-02-06 13:11

Citat:

Ursprungligen postat av jake (Inlägg 20485938)
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>&nbsp;<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?

F*N vilken skitkod, skriv om och skriv rätt!

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.


Alla tider är GMT +2. Klockan är nu 08:38.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson