webForumDet fria alternativet

Typblandningsfel i villkorsuttryck

ASP

11 svar · 2 931 visningar · startad av karlj87

Medlem sedan mars 2004662 inlägg
Frågan#1

Hej!

Får följande felmeddelande:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][Drivrutin för ODBC Microsoft Access] Typblandningsfel i villkorsuttryck.

/las2.asp, line 54

Sista raden i följande stycke är rad 54

Set RecSet = Server.CreateObject("ADODB.Recordset")
	SQL = "SELECT * FROM kommentarer WHERE artikelid = " & Request.Querystring("id")
	SQL = SQL & " ORDER BY datum DESC"
	RecSet.Open SQL, Connect, adOpenStatic, adLockOptimistic

Har sökt lite på wF angående problemet men hittade inget svar. :( Så nu undrar jag om nån av er där ute har lösningen på problemet?

Tack på förhand! (y)

Medlem sedan aug. 20039 340 inlägg
#2

Jag vet inte lösningen till ditt problem, men däremot ser jag direkt att den koden du använder har ett säkerhetshål, eftersom den möjliggör s k SQL injection.
Se till att omvandla Request.Querystring("id") till ett heltal, annars kan en hackare förändra SQL-frågan, och t ex radera hela din databas.

Medlem sedan dec. 20003 563 inlägg
#3

Om du av någon anledning har artikelid som char/text/... istället för numeriskt ska det vara

SQL = "SELECT * FROM kommentarer WHERE artikelid = '" & Request.Querystring("id") & "' "

Se till att omvandla Request.Querystring("id") till ett heltal, annars kan en hackare förändra SQL-frågan, och t ex radera hela din databas.

Beror iofs på om trådskaparen kontrollerat värdet tidigare eller inte. En enkel check såsom isnumeric() är aldrig fel i alla fall.

Medlem sedan nov. 20021 222 inlägg
#4

Du har inga mer SQL satser där problemet kan spöka?

Medlem sedan mars 2004662 inlägg
#5

Tack för att ni påpekade att min kod var en säkerhetsrisk. (y) :(

Iaf så så här hela min kod ut så här:

<!-- #include file = "adovbs.inc" -->
<%
Set Connect = Server.CreateObject("ADODB.Connection") 
Connect.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("artiklar/artiklar.mdb")

	Set RecSet = Server.CreateObject("ADODB.Recordset")
	SQL = "SELECT * FROM artiklar WHERE id = " & Request.Querystring("id")
	SQL = SQL & " ORDER BY rubrik"
	RecSet.Open SQL, Connect, adOpenStatic, adLockOptimistic
%>
  <tr> 
    <td class="rubrik"><% =RecSet("rubrik") %></td>
  </tr>
  <tr> 
    <td class="ingress"><% =RecSet("ingress") %></td>
  </tr>
    <tr> 
    <td class="brodtext"><%text = server.htmlencode(RecSet("innehall"))%><%= Replace(text,vbCrLf,"<br>")%></td>
  </tr>
  <tr> 
    <td class="ingress">Skriven av:&nbsp; <a href="mailto:<%=RecSet("epost")%>"><%=RecSet("av")%></a> </td>
  </tr>
  <tr>
    <td class="ingress">Datum:&nbsp; <%=RecSet("datum")%> </td>
  </tr>
    <tr>
    <td><a href="JavaScript:history.back()"><img src="graphs/pil_back.gif" border="0" width="19" height="13" alt=""></a></td>
  </tr>

  <%
RecSet.Close
Connect.Close
Set RecSet = Nothing
Set Connect = Nothing
%>

<%
Set Connect = Server.CreateObject("ADODB.Connection") 
Connect.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("artiklar/artiklar.mdb")

	Set RecSet = Server.CreateObject("ADODB.Recordset")
	SQL = "SELECT * FROM kommentarer WHERE artikelid = " & Request.Querystring("ID")
	SQL = SQL & " ORDER BY datum DESC"
[B]	RecSet.Open SQL, Connect, adOpenStatic, adLockOptimistic[/B]  <- rad 54
Do Until RecSet.EOF
%>
<%=RecSet("namn")%><br>
<%=RecSet("text")%>
  
    <%
RecSet.MoveNext
Loop
	RecSet.Close
	Connect.Close
	Set RecSet = nothing
	Set Connect = nothing

%>
<%
IF not Request.Form("namn") = "" then
namn = Request.Form("namn")
text = Request.Form("text")
artikelid = Request("id")

Set Connect = Server.CreateObject("ADODB.Connection") 
Connect.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & Server.MapPath("artiklar/artiklar.mdb")
Set RecSet = Server.CreateObject("ADODB.Recordset")

SQL = "Select * From kommentarer" 
RecSet.Open SQL, Connect, adOpenStatic, adLockOptimistic

	RecSet.AddNew
	RecSet("namn") = namn
	RecSet("text") = text
	RecSet("artikelid") = artikelid
	RecSet("datum") = date
	RecSet.Update
	
	RecSet.Close
	Connect.Close
	Set RecSet = nothing
	Set Connect = nothing
	end if
	%>
<tr>
<td>
<form name="form1" method="post" action="las2.asp?<%=request.querystring%>">
  <table width="300" border="0">
    <tr> 
      <td width="75"><b><font face="Verdana" size="1">Namn:</font></b></td>
      <td width="225"> <b><font face="Verdana" size="1"> 
        <input type="text" name="namn" style="border: 1px solid; font-family: verdana; font-size: 8pt">
        </font></b></td>
    </tr>
    <tr> 
      <td width="75"><font face="Verdana" size="1"><b>Innehåll:</b></font></td>
      <td width="225"><font size="1" face="Verdana">&nbsp;&nbsp;&nbsp;</font></td>
    </tr>
  </table>
  <font face="Verdana"> </font>
  <table  border="0">
    <tr> 
      <td><font face="Verdana"> 
        <textarea name="text" wrap="VIRTUAL" cols="30" style="border: 1px solid; font-family: verdana; font-size: 8pt" rows="10"></textarea>
        </font></td>
    </tr>
    <tr>
      <td>
        <input type="submit" name="Skicka" value="Lägg till" style="border: 1px solid; font-family: verdana; font-size: 8pt">
      </td>
    </tr>
  </table>
  <font face="Verdana"> </font> 
</form>
</td>
</tr>

och felet blir det här:

Microsoft OLE DB Provider for ODBC Drivers error '80040e07'

[Microsoft][Drivrutin för ODBC Microsoft Access] Typblandningsfel i villkorsuttryck.

/las2.asp, line 54

Jag skrev in adressen "las2.asp?id=18".

Tack.

/r Inte säkerhetsrik utan säkerhetsrisk. :)

Medlem sedan juni 200032 967 inlägg
#6

Vad är det för datatyp på fältet artikelid (i tabllen kommentarer) då?

Medlem sedan mars 2004662 inlägg
#7

Text.

Medlem sedan juni 200032 967 inlägg
#8

Varför, åh varför?????
Du lagrar ju numeriska ID:n, så byt till taltyp, på momangen!

(Annars gäller ju apostrofer runt strängvärden, precis som cyprys påpekar här.)

Medlem sedan mars 2004662 inlägg
#9

Tackar ännu en gång @nders! (y)

Medlem sedan dec. 20003 563 inlägg
#10

karlj87 skrev:

Tackar ännu en gång @nders! (y)

Så lite så.

Medlem sedan feb. 20067 inlägg
#11

@nders skrev:

Ta bort alla apostrofer runt fältvärden för fält som är av typen tal.

I övrigt: för lättare felsökning; skriv ut den färdiga sql-frågan istället (response.write sqltemp2)

Slutligen: välkommen till wF! :bire

Tack för tipset, men det går ungefär lika bra (dvs dåligt). Vad menar du med att skriva ut den färdiga sql-frågan?

Medlem sedan dec. 200012 464 inlägg
#12

Vbyrongte: Jag delade tråden så att du får en egen, du kan fortsätta diskussionen där.

271 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
142 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)