Lektion vette fan om jag skulle kalla det ;)
CStr() formaterar ett värde till en string. Replace() returnerar en string. Med andra ord är det inte nödvändigt att sätta CStr() på ett värde som kommer ur Replace().
23 svar · 699 visningar · startad av Dashi
Hej har haft en liten lektion av Poffe angående sql injections och suttit och läst lite sidor, funderade sedan lite och tänkte på lite det här med koden.. skulle vilja veta vilken av följande koder som funkar bäst mot sql injections:
Kod1
name = Request.Form("name")
visa = "SELECT DISTINCT resultat, datum FROM resultattab WHERE name = '" & Replace(name, "'", "''") & "' ORDER BY datum"
Kod2
name = Cstr(Request.Form("name"))
visa = "SELECT DISTINCT resultat, datum FROM resultattab WHERE name = '" & Replace(name, "'", "''") & "' ORDER BY datum"
kan man sätta Replace "'" "''" på:
name = Cstr(Request.QueryString/Form("name"))??
eller ska man inte det? ifall man ska det, ska man då ha kvar Cstr?
hur ser det då ut?
kan man sätta Cstr på:
visa = "SELECT DISTINCT resultat, datum FROM resultattab WHERE name = '" & Replace(name, "'", "''") & "' ORDER BY datum???
eller det ska man inte göra? räcker det med replace?
Mvh //Darek
Lektion vette fan om jag skulle kalla det ;)
CStr() formaterar ett värde till en string. Replace() returnerar en string. Med andra ord är det inte nödvändigt att sätta CStr() på ett värde som kommer ur Replace().
Poffe skrev:
Lektion vette fan om jag skulle kalla det ;)
CStr() formaterar ett värde till en string. Replace() returnerar en string. Med andra ord är det inte nödvändigt att sätta CStr() på ett värde som kommer ur Replace().
okej så alltså kod1 funkar bäst då?
tänkte på det för att jag läste det att Cint använder man för att skriva ut, eller skapa ett värde när det gäller ett tal och Cstr använder man när det gäller text
id = Cint(Request.Form("id"))
text = Cstr(Request.Form("text"))
..något som däremot kan vara intressant är att kolla om värdena man får är numeriska (om nu detta krävs p g a databasens uppbyggnad):
dim x as integer
x = request.querystring("catId")
if not isnumeric(x) then
'x är inte numeriskt, skriv ut nåt felmeddelande
else
'x är numeriskt, fortsätt
x = replace(x,"'","''")
end if
Om man ska plocka ut info från databasen som baseras på en siffra så kommer i annat fall ett fel att genereras.
Båda fungerar lika bra, men som jag ser det finns det ingen direkt anledning att använda CStr() vid just det tillfället.
Men det är riktigt, man ska formatera data efter vad det ska vara, då är man säker på att inte få några fel p.g.a felaktiga datatyper.
Poffe skrev:
Båda fungerar lika bra, men som jag ser det finns det ingen direkt anledning att använda CStr() vid just det tillfället.
Men det är riktigt, man ska formatera data efter vad det ska vara, då är man säker på att inte få några fel p.g.a felaktiga datatyper.
okej, men det är väl lika bra att sätta det om man gör det annars i vanliga fal??
det skulle väl passa i t.ex denna kod???:
(kolumnen name och text är satt till text och kolumnen id är satt till tal)
id = Cint(Request.Form("id"))
name = Cstr(Request.Form("name"))
text = Cstr(Request.Form("text"))
laggtill = "SELECT * FROM tabell WHERE name = " & Replace(name, "'", "''") & " AND id = " & Replace(id, "'", "''")
RecSet.AddNew
RecSet("id") = id
RecSet("name") = name
RecSet("text") = text
Ja visst kan du göra det, det skadar inte =)
Däremot finns det ingen mening med att sätta en replace på id i ditt fall
Replace(id, "'", "''")
Precis innan har du ju konverterat id till tal, alltså kan det inte innehålla några '.
Däremot så borde man innan man formaterar nått till ta verkligen kolla s det är ett tal, som soderlund visar här ovan.
såg nämligen denna koden på ett ställe:
Anv = Replace(Trim(Request.Form("Anv")),"'","")
Passwd = Replace(Trim(Request.Form("Passwd")),"'","")
SQL = "SELECT * FROM tabellnamn WHERE User = '" & Anv & "' AND Losen = '" & Passwd & "'"
funkar detta då på samma sätt som:
Anv = Request.Form("Anv")
Passwd = Request.Form("Passwd")
SQL = "SELECT * FROM tabellnamn WHERE User = '" & Replace(Anv, "'", "''") & "' AND Losen = '" & Replace(Passwd, "'", "''") & "'"
???
vad gör trim för något i den översta koden?
Använd sökfunktionen här eller VBScript referensverk (MSDN) eller Google. Där finns allt du behöver veta.
Speciellt om du vet vad du är ute efter, i detta fall trim, sök då på det för det finns massor av information där ute.
Poffe skrev:
Använd sökfunktionen här eller VBScript referensverk (MSDN) eller Google. Där finns allt du behöver veta.
Speciellt om du vet vad du är ute efter, i detta fall trim, sök då på det för det finns massor av information där ute.
okej ska jag göra.. men funkar dom 2 koderna som jag visa på samma sätt?
Nej, första koden tar bort ' helt andra ordnar bara så de kan användas i databasen.
Poffe skrev:
Nej, första koden tar bort ' helt andra ordnar bara så de kan användas i databasen.
okej såg de nu... men om jag då skulle ändra från "" till "''" så skulle det funka på samma sätt?
men jag fattar inte, är det någon mening att ta bort ' helt?? vad är det för skillnad att göra replace så dom blir 2 än att göra än replace så dom försvinner helt??
Dashi skrev:
men jag fattar inte, är det någon mening att ta bort ' helt?? vad är det för skillnad att göra replace så dom blir 2 än att göra än replace så dom försvinner helt??
Byter du ut en apostrof mot två, så kommer du få en i databasfältet. Tar du bara bort den, så kommer den inte lagras i databasfältet.
Vidare; jag skulle rekommendera dig att döpa dina variabler till lite vettigare saker än 'visa' och sånt tjafs från IDG's WebStudio. Använd 'datatyps'-prefix, som t.ex. sSQL eller strSQL istället. En strängvariabel som heter 'visa' är inte så förklarande.
Dessutom skulle jag nog välja att skapa en generell metod för det där med att säkra SQL-injections.
Function SQLEncode(ByVal sParameter)
SQLEncode = Replace(sParameter, "'", "''")
End Function
OveRRidE skrev:
Dashi skrev:
men jag fattar inte, är det någon mening att ta bort ' helt?? vad är det för skillnad att göra replace så dom blir 2 än att göra än replace så dom försvinner helt??
Byter du ut en apostrof mot två, så kommer du få en i databasfältet. Tar du bara bort den, så kommer den inte lagras i databasfältet.
Vidare; jag skulle rekommendera dig att döpa dina variabler till lite vettigare saker än 'visa' och sånt tjafs från IDG's WebStudio. Använd 'datatyps'-prefix, som t.ex. sSQL eller strSQL istället. En strängvariabel som heter 'visa' är inte så förklarande.
Dessutom skulle jag nog välja att skapa en generell metod för det där med att säkra SQL-injections.
Function SQLEncode(ByVal sParameter) SQLEncode = Replace(sParameter, "'", "''") End Function
okej.. har en liten fråga angående det med koden.. eftersom det är jag som jobbar med det så är det ju jag som ser koden hela dagarna, ska jag inte då anpassa koden som jag tycker det är lättast att läsa den? :P
Mvh //Darek
Dashi skrev:
okej.. har en liten fråga angående det med koden.. eftersom det är jag som jobbar med det så är det ju jag som ser koden hela dagarna, ska jag inte då anpassa koden som jag tycker det är lättast att läsa den? :P
Mvh //Darek
Om du tycker det är enklare att hålla reda på variablarna när de har helt orelevanta namn än när de har namn som refererar till vad de innehåller så får du så klart ha det. Men om någon annan ska jobba med koden senare eller om du vill ha hjälp så är det mycket enklare att sätta sig in i koden när det står tydligt vad som är vad.
okej tycker bara det är lättare så, och alla jag vissat min kod har förståt den hittils.. kanske ändrar den sen när jag blivit mer insatt i kodningen och lärt mig lite mer namn på olika variblar och stränger och så.
Läser jag min kod så ser jag vad databasen gör eftersom det står visa.. sätter jag det till sSQL eller strSQL som OveRRidE föreslog så kommer jag nog börja tappa bort mig lite mer och måste då kolla igenom hela koden för att förstå vad den gör..
så jag har satt det så för att förenkla för mig själv, har själv sett att dom flesta sätter SQL = "SELECT....... men jag håller mig till det jag har för tillfället :) Tack ändå..
Mvh //Darek
Alla gör som dom vill, det vara bara ett litet tips för att utveckla dig själv lite. Anledningen till att de flesta väljer att använda strSQL eller liknande är ju för att det är SQL-kod.
Personligen förstår jag inte varför Visa är enklare att förstå då det inte har något med sammanhanget att göra men om du tycker det är enklare så får du ha det så.
Poffe skrev:
Alla gör som dom vill, det vara bara ett litet tips för att utveckla dig själv lite. Anledningen till att de flesta väljer att använda strSQL eller liknande är ju för att det är SQL-kod.
Personligen förstår jag inte varför Visa är enklare att förstå då det inte har något med sammanhanget att göra men om du tycker det är enklare så får du ha det så.
blir enklare att använda eftersom jag använder Visa när den ska skriva ut data, tabort när den ska tabort någon data och byta om den ska ändra något i databasen :P så då kollar jag bara på vad det står och vet då vad databaskopplingen gör :)
du Poffe har du lust att titta på denna tråden.. http://www.webforum.nu/showthread.php?s=&threadid=122424&forumid=22
Dashi skrev:
du Poffe har du lust att titta på denna tråden..
Vi håller oss till en tråd per tråd, tack.
Dashi skrev:
blir enklare att använda eftersom jag använder Visa när den ska skriva ut data, tabort när den ska tabort någon data och byta om den ska ändra något i databasen så då kollar jag bara på vad det står och vet då vad databaskopplingen gör
Det faktum att det faktiskt inte ens är du som har bestämt att den skall kallas 'Visa' bevisar ju bara ytterligare att du egentligen inte har någon praktisk mening eller anledning med att faktiskt använda så oförklarliga namn på variabler, eftersom detta underbara fenomen med dessa speciellt namngivna strängvariabler kommer från, som jag sa innan; IDG's WebStudio, som för övrigt står för dålig källkod. Något som påpekats tidigare.
Dashi skrev:
ska jag inte då anpassa koden som jag tycker det är lättast att läsa den?
Du tycker inte att det kan vara av intresse att göra din kod läsbar i allmänhet om du nu måste ha någon annan som skall utveckla/jobba med din kod? Om du skall jobba vidare med programutveckling får du nog räkna med att du får lära dig att skriva snyggare kod än sådär. ;)
Precis som Poffe säger, så får du givetvis göra hur du vill, men jag anser att det bara är korkat att säga att 'det fungerar för mig' utan att försöka förbättra sin kodmodell. Det är taskigt mot nästa programmerare och det är inte direkt utvecklande för dina kunskaper. Dessutom kan man faktiskt döpa sina strängvariabler till mer förklarliga namn, ifall du nu vill det;
sSqlAddUser = "INSERT INTO tblUser (UserName, UserPassword) VALUES ('foo','bar')"
sSqlDeletePost = "DELETE FROM tblPost WHERE PostId = 42"
sSqlGetAllThreads = "SELECT * FROM tblThread ORDER BY ThreadCreationDate ASC"
Hej!
Angående sql-injections så är mitt råd att du använder dig av parameteriserade frågor (Det finns tillfällen då ersättning av ' inte räcker). Exempel på det hittar du här:
http://www.swesecure.com/?ID=dc6ea60a-12ae-4e7e-9e9c-59489ccafa90&IID=d628e96e-f8fd-44ed-9537-4061c817e9b1
Om du vill läsa mer om sql-injection så hittar du det här:
http://www.swesecure.com/?ID=dc6ea60a-12ae-4e7e-9e9c-59489ccafa90&IID=29a58b01-ca79-4877-b924-4f5da18d4a2a
Lycka till!