Kom ihåg mig?
Home Menu

Menu


validera kod för att hindra sql-injections

 
Ämnesverktyg Visningsalternativ
Oläst 2014-01-24, 03:45 #1
jake jake är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2003
Inlägg: 1 145
jake jake är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2003
Inlägg: 1 145
Standard 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")

%>
jake är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-01-24, 07:22 #2
fabians avatar
fabian fabian är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jul 2004
Inlägg: 2 162
fabian fabian är inte uppkopplad
Klarade millennium-buggen
fabians avatar
 
Reg.datum: Jul 2004
Inlägg: 2 162
<% 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

%>

Senast redigerad av fabian den 2014-01-24 klockan 07:23 Anledning: Förtydligande
fabian är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-01-24, 20:25 #3
Sony? Sony? är inte uppkopplad
Medlem
 
Reg.datum: May 2012
Inlägg: 55
Sony? Sony? är inte uppkopplad
Medlem
 
Reg.datum: May 2012
Inlägg: 55
I PHP finns mysql_real_escape_string / PDO med prepared statements. Det måste väl finnas i ASP också?
Sony? är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-01-25, 12:56 #4
fabians avatar
fabian fabian är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jul 2004
Inlägg: 2 162
fabian fabian är inte uppkopplad
Klarade millennium-buggen
fabians avatar
 
Reg.datum: Jul 2004
Inlägg: 2 162
Citat:
Ursprungligen postat av Sony? Visa inlägg
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å...
fabian är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-01-28, 21:23 #5
dAEks avatar
dAEk dAEk är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2006
Inlägg: 678
dAEk dAEk är inte uppkopplad
Mycket flitig postare
dAEks avatar
 
Reg.datum: Dec 2006
Inlägg: 678
Citat:
Ursprungligen postat av fabian Visa inlägg
Nej.
Jo, det finns visst. Tro det eller ej.
dAEk är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-01-29, 10:00 #6
fabians avatar
fabian fabian är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Jul 2004
Inlägg: 2 162
fabian fabian är inte uppkopplad
Klarade millennium-buggen
fabians avatar
 
Reg.datum: Jul 2004
Inlägg: 2 162
Citat:
Ursprungligen postat av dAEk Visa inlägg
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
fabian är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-01-30, 19:25 #7
dAEks avatar
dAEk dAEk är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2006
Inlägg: 678
dAEk dAEk är inte uppkopplad
Mycket flitig postare
dAEks avatar
 
Reg.datum: Dec 2006
Inlägg: 678
Citat:
Ursprungligen postat av fabian Visa inlägg
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.

Senast redigerad av dAEk den 2014-01-30 klockan 19:27
dAEk är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-02-06, 04:01 #8
jake jake är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2003
Inlägg: 1 145
jake jake är inte uppkopplad
Har WN som tidsfördriv
 
Reg.datum: Jul 2003
Inlägg: 1 145
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?
jake är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-02-06, 12:52 #9
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av dAEk Visa inlägg
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

Senast redigerad av Conny Westh den 2014-02-06 klockan 13:00
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Oläst 2014-02-06, 13:11 #10
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Conny Westh Conny Westh är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: Aug 2005
Inlägg: 5 166
Citat:
Ursprungligen postat av jake Visa inlägg
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.
Conny Westh är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 12:11.

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