03. juli 2012 - 16:02Der er
14 kommentarer og 1 løsning
Data type mismatch in criteria expression
Hejsa ...
På en webside har jeg følgende link ...
.../test.asp?gr=1
I selve test.asp laver jeg
strsql = "SELECT * FROM udbud where gruppe = ('"& clng(request("gr")) &"') ORDER BY produkt, pot asc"
Kolonnen i min access database er langt heltal ... jeg får følgende fejl ...
Microsoft OLE DB Provider for ODBC Drivers error '80040e07' [Microsoft][ODBC Microsoft Access Driver] Data type mismatch in criteria expression. ../udbud.asp, line 15
Skifter jeg request'en ud med fx et et tal ... så spiller det bare ...
Støv, fibre og metalliske partikler kan påvirke både uptime, levetid og driftssikkerhed. Derfor arbejder flere datacentre systematisk med contamination control.
Det er ikke request/request.querystring der gør forskellen - der er bare ingen grund til at lede hele request-objektet igennem hvis du ved at værdien altid ligger i querystring.
at typecaste hjælper lidt på sikkerheden da input af en SQL-string ville gøre at koden fejlede - men ellers gør det ingen forskel her, dog skal der ikke ' omkring.
Replace er rigtig nok en måde mange forsøger at beskytte sig mod SQL injections ved men at replace med ~ giver ingen mening da man altid bør opbevare data som brugeren har skrevet dem ind, hvordan vil du ellers kunne se om brugeren har skrevet ' eller reelt et ~? Den rigtige måde er at bruge parametre.
Well, point taken, du har ret; jeg kan selvfølgelig ikke se om brugeren har skrevet ' eller ~ men et tal bør vel næppe indeholde en enkeltpling? Men hvis det er vigtigt at parse netop enkelplingen kunne det måske gøres som
strsql = "SELECT * FROM udbud WHERE gruppe = '"& replace(request.querystring("gr"), "'", chr(39)) &"' ORDER BY produkt, pot ASC" ?
eller
strsql = "SELECT * FROM udbud WHERE gruppe = '"& replace(request.querystring("gr"), "'", "'") &"' ORDER BY produkt, pot ASC" ?
Vil du forklare hvad du mener med "at bruge parametre"?
Tak for svar - jeg lærer nyt hele tiden: Rigtig god artikel, men hvad betyder tallene, i parantesen: Cmd.Parameters.Append(Cmd.CreateParameter("@username", 200, 1, 50))
Hvis det skal være et tal, som overføres, kan man så ikke også "sikre sig" på denne måde:
gr = request.querystring("gr") If isNumeric(gr) Then strsql = "SELECT * FROM udbud WHERE gruppe = "&gr&"' ORDER BY produkt, pot ASC" End If ?
Jo, du vil sagtens kunne sikre dig på den måde men det vil stadig være uhensigtsmæssigt da du så også skal opfinde en måde at håndtere strings på. Sætter du dig ind i parametre og benytter dem konsekvent har du en ensartet måde at gøre tingene på uanset datatyper.
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.