06. juni 2006 - 09:16Der er
49 kommentarer og 1 løsning
hvordan udgår jeg sql injections på denne kode
Her er koden hvordan får jeg sat de rigtige parameter ind ?
strSQL = "Select pris From pris Where pris = '" & Request.Form("pris") & "';"
set rst = DataConn.Execute (strSQL)
if rst.bof and rst.eof then strSQL = "Insert into pris (pris) values('" & Request.Form("pris") & "')" DataConn.Execute(strSQL) Alert = "Prisen er nu oprettet " else Alert = "Du har allerede oprettet den pris, prøv igen" end if end if %>
Danmark vil mindske afhængigheden af globale techgiganter, men det kræver mere end politiske formuleringer og strategier, understreger PROSA’s formand Niels Bertelsen.
strSQL = "Select pris From pris Where pris = '" & replace(Request.Form("pris"),"'","''") & "';"
set rst = DataConn.Execute (strSQL)
if rst.bof and rst.eof then strSQL = "Insert into pris (pris) values('" & replace(Request.Form("pris"),"'","''") & "')" DataConn.Execute(strSQL) Alert = "Prisen er nu oprettet " else Alert = "Du har allerede oprettet den pris, prøv igen" end if end if %>
...men er pris ikke numerisk i databasen? Hvis den er, så bør du checke for dette inden du benytter værdien i din SQL-sætning.
if isnumeric(Request.Form("pris")) then
strSQL = "Select pris From pris Where pris = " & Request.Form("pris") & ";"
set rst = DataConn.Execute (strSQL)
if rst.bof and rst.eof then strSQL = "Insert into pris (pris) values(" & Request.Form("pris") & ")" DataConn.Execute(strSQL) Alert = "Prisen er nu oprettet " else Alert = "Du har allerede oprettet den pris, prøv igen" end if end if end if %>
Generelt set er det en bedre idé at benytte command-objektet og parametre i stedet for denne type SQL-strenge, men det er en lidt anden historie...
og så skal du lige lægge denne metadata-linie ind i toppen af din asp-side (eller endnu bedre, i global.asa, da du så slipper for at tænke på den på resten af sitet).
Hmm... noget kunne tyde på at Sun ONE ASP ikke understøtter CommandText for command-objektet... så er spørgsmålet om man kan finde en dokumentation for Sun ONE ASP, så man kan finde ud af hvad den rent faktisk understøtter. Det jeg har vist fungerer i det mindste på en IIS med ASP, men det hjælper jo ikke dig videre...
Mht. fejlen i den tekstuelle version af SQL-sætningen, så kan du evt. undersøge om der skulle være nogle af værdierne som ikke er numeriske i dit input (f.eks. postnr og pris) og hvor databasen forventer at de er numeriske. Det samme gælder for dato... I det hele taget bør du lave en validering af indholdet i formularen inden du forsøger at indsætte data i databasen, for at fange evt. fejl så tidligt som muligt (det sparer tid og resurser).
men igen kan det være at databasen (hvad end det så er for en) forventer en anden form for strengafgrænser (f.eks. ´ i stedet for ''), så det kan være denne fungere i stedet:
det er der problemmet er når jeg opretter et hodl med holdnr = ' så laver den Error Type: ADODB.Recordset.1 (0x80004005) SQLState: 4 Native Error Code: 1064 [TCX][MyODBC]You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1 denne fejl
Jeg kender ikke lige noget login system (hvad end det så er :))
Hvad angår den fejl du skriver, hvad er det så rent faktisk du skriver, for den meddelelse lyder da noget spøjs, hvis der end ikke er nogen apostrof i SQL-sætningen...
Prøv evt. at skrive SQL-sætningen ud inden du udfører den (evt. efterfulgt af en Response.Flush, så den når at blive udskrevet inden siden fejler).
login system he he altså opret en bruger der har adgang til et system.. ligesom her på eksperten...
Jamen jeg har rettet al min kode til så jeg kan taste et ' ind i alle felter uden databasen går ned.. og det er jo din gode kode jeg bruger der..
men når jeg opretter et hold hvor jeg taster ' ind i holdnr feltet laver siden fejlen som jeg viser ovenover...
ADODB.Recordset.1 (0x80004005) SQLState: 4 Native Error Code: 1064 [TCX][MyODBC]You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near ''''' at line 1 denne fejl
OK, det lyder som en god test... med mindre du forsøger at gemme en apostrof i et talfelt for det skal du validere for inden du indsætter data i din database :) - talfelter skal være numeriske (eller NULL hvis dette tillades for det enkelte felt) eller vil databasen brokke sig, så det skal du lige be- eller afkræfte først.
Hvis holdnr er et tekstfelt så skal du blot bruge samme fremgangsmåde som vist tidligere, nemlig
strSQL = "select count(*) as antalTilmeldte from tilmelding where holdnr = '" & replace(rs("holdnr")&"", "'","´") & "'"
Umiddelbart kan du benytte funktionen isNumeric til at checke om en værdi er numerisk. Det skal du så gøre inden der gemmes noget som helst i databasen. F.eks.:
if isNumeric(Request.Form("holdnr")&"") then strSQL = "Select holdnr From hold Where holdnr = " & Request.Form("holdnr") & ";"
DataConn.Execute(strSQL) Alert = "Holdnummer er nu oprettet " else Alert = "Du har allerede oprettet det holdnummer, prøv igen" end if end if
Når du nu er igang med at finde numeriske felter, mon så ikke også holdantal er et tal...? Hvis jo, så kan du jo lige øve dig på det felt (se hvad jeg har gjort ifht. feltet holdnr - det samme skal i så fald gøres ved holdantal)...
Det er ville være en god idé (regnede dog med at du selv lige kunne smide relevante fejlbeskeder på). Det er altid en god idé at validere input, selvom du har afgrænset brugerens mulighed til at vælge fra en drop down - det kunne jo være der var en som fik den snedige idé at poste deres egen version af din form til serveren og så er du jo ikke sikker på at værdien er numerisk længere (trust nobody! :))...
DataConn.Execute(strSQL) Alert = "Holdnummer er nu oprettet " else Alert = "Du har allerede oprettet det holdnummer, prøv igen" end if else Alert = "Du skal angive holdnr som et tal" end if
DataConn.Execute(strSQL) Alert = "Holdnummer er nu oprettet " else Alert = "Du har allerede oprettet det holdnummer, prøv igen" end if else Alert = "Du skal angive holdnr som et tal" end if end if
hvad bruger jeg hvis if isNumeric(Request.Form("holdnr")&"") then ikke er et tal men bare et text felt.. alstå de skal skrive noget i feltet.... det må ikke være blank?
nu er den ikke god.. her skal jeg rette men den skriver alerten med det samme ?
if isNumeric(Request.Form("tider")&"") then if request.form("update") <> "" then
strSQL = "update starttid set tider='" & replace(Request.Form("tider"),"'","''") & "' where id = " & request.querystring("id") Set rs = DataConn.Execute(strSQL)
Alert = "Starttiden er nu opdateret "
end if else Alert = "Du skal angive starttid som et tal"
end if strSQL = "Select * From starttid Where Id = " & Request.Querystring("id") Set rs = DataConn.Execute(strSQL)
Ikke som sådan. Jeg plejer at håndkode det jeg skal bruge. Det nærmeste jeg kan komme sådan noget er et CMS-system, men der har jeg ikke erfaring med noget der kører på ASP og MySQL - så der kan jeg desværre ikke hjælpe...
07/06-2006 23:24:55 >> Jeg er ikke helt sikker på at jeg forstår hvad du mener. Hvis du vil have udskrevet beskeden i stedet for at tildele den variablen Alert, kan du bare udskifte teksten "Alert = " med "Response.Write ", altså:
if isNumeric(Request.Form("tider")&"") then if request.form("update") <> "" then strSQL = "update starttid set tider='" & replace(Request.Form("tider"),"'","''") & "' where id = " & request.querystring("id") Set rs = DataConn.Execute(strSQL)
Response.Write "Starttiden er nu opdateret " end if else Response.Write "Du skal angive starttid som et tal" end if
ja du har ret men jeg kan ikke lige se om den står forkert ..
if isNumeric(Request.Form("pris")&"") then
if request.form("update") <> "" then strSQL = "update pris set pris='" & replace(Request.Form("pris"),"'","''") & "' where id = " & request.querystring("id") Set rs = DataConn.Execute(strSQL)
Alert = "Prisen er nu opdateret " end if else Alert = "Du skal angive pris som et tal"
end if strSQL = "Select * From pris Where Id = " & Request.Querystring("id") Set rs = DataConn.Execute(strSQL)
I den der stump kode ser der ikke ud til at være nogen problemer med stukturen, så på det grundlag kan jeg ikke lige se hvad der skulle være galt...
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.