webForumDet fria alternativet

Skydda SQL satser?

13 svar · 584 visningar · startad av Bosse168

Bosse168Medlem sedan nov. 20031 018 inlägg
#1

skyddar denna funktion mot SQL attacker eller kan man göra den ännu säkrare?

Function secure(txt) 
txt = Replace(txt, "'", "''")
secure = txt 
End Function

Denna funktion kollar i alla fält i SQL satsen.

VideMedlem sedan dec. 19998 577 inlägg
#2

För att säkra ytterligare mot "SQL injection" bör du även kontrollera att numeriska värden verkligen är numeriska.

Bosse168Medlem sedan nov. 20031 018 inlägg
#3

Kan man göra det direkt i SQL satsen?

VideMedlem sedan dec. 19998 577 inlägg
#4

Nja, även om det skulle gå så är det ingen bra idé eftersom du då inte, med lätthet, kan skapa en felkontroll.

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#5

När man använder sig av numreriska värden som kommer från Request.Form eller Request.QueryString så bör man ta för vana att alltid använda CLng. Skulle det då vara ett tecken som inte är en siffra som kommer med så skulle det bli ett ASP-fel.

Bosse168Medlem sedan nov. 20031 018 inlägg
#6

Om man använder dom här kontrollerna då borde man väl vara säker:

Function secure(txt) 
txt = Replace(txt, "'", "''")
secure = txt 
End Function 

function killChars(strWords) 

dim badChars 
dim newChars 

badChars = array("select", "drop", ";", "--", "insert",  
"delete", "xp_") 
newChars = strWords 

for i = 0 to uBound(badChars) 
newChars = replace(newChars, badChars(i), "") 
next 

killChars = newChars 

end function

[B]SQL satsen[/B]
"INSERT INTO note (memb,note) VALUES('"& secure(Session("username")) &"','"& secure(killChars(Request.Form("note"))) &"')")"
VideMedlem sedan dec. 19998 577 inlägg
#7

Jag skulle personligen använda funktionen IsNumeric för att avgöra om det är ett tal eller inte, om inte så är fallet kan jag meddela klienten (som jag antar har skickat värdet i detta fallet) att han matat in ogiltiga värden. Min filosofi är att aldrig visa system-felmeddelanden för klienten.

Mvh, Vide

Bosse168Medlem sedan nov. 20031 018 inlägg
#8

Men det är ju inte alltid QueryStrings och formulär är siffror.

VideMedlem sedan dec. 19998 577 inlägg
#9

Självklart inte, och då skall du ju inte kontrollera om det är numeriskt eller inte eftersom du i dessa fall ersätter ' med ''. :)

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#10

Är det siffror kunden matar in själv så bör man göra en kontroll. Däremot så litar jag inte på IsNumeric efter som att det med den kan smyga sig in bokstäver.

Är det däremot id:n som kommer från QueryStringen så känns det löjligt att meddela användaren om att han matat in felaktiga siffror.

Bättre då att fixa en generell felhantering som visar upp ett vänligt felmeddelande till användaren och loggar det riktiga felmeddelandet.

OveRRidEMedlem sedan feb. 200112 078 inlägg
#11

Bosse; ang. strängvärden; eftersom du ersätter apostroferna först, så är du ju redan 'homerun' så att säga, eftersom utan dessa kan du inte 'escape':a ur strängvärdet. Då får de gärna skriva hur mycket DROP, --, DELETE eller pipes de vill, de hjälper ju inte ändå?

Viktigast är som sagt att se till att;

  1. ..numeriska värden antingen manglas genom isNumeric() eller typkonverteras med CInt() eller CLng().
  2. ..strängvärden kontrolleras och rensas från apostrofer och %.
clarkbonesMedlem sedan feb. 20013 023 inlägg
#12

Rycker upp en gammal tråd

Erik Juhlin skrev:

Däremot så litar jag inte på IsNumeric efter som att det med den kan smyga sig in bokstäver.

Hmm, menar du att IsNumeric skulle göra fel?

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#13

IsNumeric kan släppa igenom annat än siffror. Den släpper igenom flyttal som kan ha bokstäver i sig.

Erik JuhlinMedlem sedan maj 200010 687 inlägg
#14

Prova:

Response.Write IsNumeric("911002D80")
129 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
126 ms — hämta tråd, inlägg och bilagor (db)