Avatar billede passiflora Juniormester
03. juli 2012 - 16:02 Der 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 ...

Hvad pokker gør jeg mon forkert ...

/Søren
Avatar billede keysersoze Guru
03. juli 2012 - 16:36 #1
...where gruppe = clng(request.querystring("gr")) ORDER BY...

Og kig samtidig på denne artikel; http://www.web-dev.dk/post/SQL-injections-mere-end-bare-et-pling.aspx
Avatar billede passiflora Juniormester
03. juli 2012 - 20:37 #2
Tak ...

Hvorfor er det mon jeg kun har brugt request ... hmm
tester lige i morgen ...

Du sender nok lige et svar ...

/Søren
Avatar billede keysersoze Guru
03. juli 2012 - 22:37 #3
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.
Avatar billede passiflora Juniormester
03. juli 2012 - 23:09 #4
... åh ... nu tror jeg at jeg forstår ...
Og lærte nyt om request ... tak
Avatar billede passiflora Juniormester
04. juli 2012 - 08:43 #5
Bare for en ordensskyld ... så er den rigtige løsning denne ...

    ... where gruppe= "&  clng(request("gr")) & " ORDER ...
Avatar billede passiflora Juniormester
04. juli 2012 - 08:48 #6
Ubs ... selvfølgelig med ... request.querystring
Avatar billede keysersoze Guru
04. juli 2012 - 11:02 #7
sorry - ja, selvfølgelig. Det er vist bare for lang tid siden jeg har lavet gammeldags ASP. Men stadig, husk nu at tage højde for SQL Injection.
Avatar billede passiflora Juniormester
04. juli 2012 - 11:18 #8
... skal nok prøve at læse noget om SQL Injection ... og få dem implementeret ...
Avatar billede at_dk Nybegynder
08. juli 2012 - 20:04 #9
Det kunne også gøres sådan:

strsql = "SELECT * FROM udbud WHERE gruppe = '"&  clng(replace(request.querystring("gr")), "'", "~") &"' ORDER BY produkt, pot ASC"

eller måske bare sådan:

strsql = "SELECT * FROM udbud WHERE gruppe = '"&  replace(request.querystring("gr"), "'", "~") &"' ORDER BY produkt, pot ASC"

Da jeg mener at type casting i dette tilfælde ikke er nødvendig når "tallet" er omsluttet af '', men jeg er ikke sikker??

og med replace, så det vel rimelig sikret mod SQL Injections?!
Avatar billede keysersoze Guru
08. juli 2012 - 20:59 #10
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.
Avatar billede at_dk Nybegynder
09. juli 2012 - 09:06 #11
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"?
Avatar billede keysersoze Guru
09. juli 2012 - 09:28 #12
det jeg skriver - og som også var løsningen - var at input af tal og bogstaver er forskelligt;

...WHERE tal = " & request.querystring("tal") & "...

...WHERE tekst = '" & request.querystring("tekst") & "'...

Skal man endelig køre en replace bør det nok være

...WHERE tal = " & replace(request.querystring("tal"), "'", "''") & "...

Men som sagt så benyt parametre - det kan du læse om i linket i første kommentar.
Avatar billede at_dk Nybegynder
09. juli 2012 - 10:00 #13
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
?
Avatar billede keysersoze Guru
10. juli 2012 - 22:26 #14
http://www.w3schools.com/ado/met_comm_createparameter.asp

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.
Avatar billede passiflora Juniormester
29. juli 2012 - 17:25 #15
Takker også ...
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester