Avatar billede ravnkilde Nybegynder
04. februar 2008 - 13:55 Der er 9 kommentarer og
1 løsning

Bøvl med apostrof i navn og anførselstegn

Jeg har flg. kode:

<% Available_seats("23 : May 14-16 : Elke D'Ervin") %>

Koden kan ikke afvikles pga. apostroffen i navnet D'Ervin. Jeg har forsøgt mange mulige løsninger med at "indkapsle" tegnet ', men uden held.

Nogen, der kan hjælpe?
Avatar billede fennec Nybegynder
04. februar 2008 - 13:57 #1
Snakker vi i en DB indsættelse?? For så skal du bare erstatte ' med 2:

sql = "indsert into dinTabel(kol1) values('"& replace("Elke D'Ervin","'","''") &"')"
Avatar billede ravnkilde Nybegynder
04. februar 2008 - 13:59 #2
Nej, fennec. Her er den forudgående kode:

Set objConn = Server.CreateObject("ADODB.Connection")
    objConn.Open "Driver={Microsoft Access Driver (*.mdb)};DBQ=" & Server.Mappath("../../../../database/db.mdb")
   
    set objRec = Server.CreateObject("ADODB.Recordset")
    dim Total_Free_Seats: Total_Free_Seats = 0
   
   
    Sub Available_seats(sess)
   
        'Number of total seats
        Total_Seats = 1
   
        ' Count number of free seats
        strSQL = "Select COUNT(*) AS free_seats FROM participants WHERE Session = '" & sess & "'"
        set objRec = objConn.execute(strSQL)
        Free_Seats = Total_Seats - objRec("free_seats").Value
       
        If Free_Seats < 0 Then: Free_Seats = 0: End if
        Total_Free_Seats = Total_Free_Seats + Free_Seats
       
        'Output result
        if Free_Seats > 0 Then
            Response.Write("<option value=""" & sess & """>" & sess & " : " & Free_Seats & " Team</option>")
        Else
            'Response.Write("<option value="""">" & sess & " - " & Free_Seats & " Team</option>")
        End if
   
    End Sub

    Sub Check_for_Seats()
   
        If Total_Free_Seats = 0 Then
            Response.Write("<option value="""">* There are no available seats *</option>")
        End if
   
    End Sub
Avatar billede erikjacobsen Ekspert
04. februar 2008 - 14:01 #3
Den samme løsning - læs op på sql-injection på nettet:

strSQL = "Select COUNT(*) AS free_seats FROM participants WHERE Session = '" & replace(sess,"'","''") & "'"
Avatar billede fennec Nybegynder
04. februar 2008 - 14:09 #4
Jeps. Det er sql-injection som jeg troede. Det eksistere også på selects, som erik også har vist.

Du kan læse om det på wikipedia:
http://en.wikipedia.org/wiki/SQL_injection

Løsningen er at "escape" ' tegnet ved at replace det med 2 (min løsning) eller slå over og bruge parametre i stedet.
Avatar billede fennec Nybegynder
04. februar 2008 - 14:24 #5
Vi havde faktisk en alvorlig sag i 2002 angående netop sql-injection.
http://www.computerworld.dk/art/14720

Valus havde ikke taget højde for sql-injection, og sammen med uheldig programmering resulterede det i at man i en ganske almindelig browser kunne stoppe databasen. Man kunne også få adgang til alle data og slette alt, og da det var et betalingssystem,  blev historien blæst op på forsiderne.

SQL-injections skal man tage meget alvorlig, da det under uheldige omstændigheder kan have katestrofale følger.
Avatar billede erikjacobsen Ekspert
04. februar 2008 - 14:44 #6
Og parameters (godt nok vist i VB.NET) er at lade systemet om at "escape" - dvs. man &-er aldrig brugerinput ind i sql-strengen. Det smarte ved det er også, at det lukker munden på kritiske sikkerhedsfolk ;)  ASP/Vbscript har også parameters (google), men det er der jo ikke så mange der bruger længere. Eksemplet:

  objcon = ....
  Dim sql1 As String = "SELECT ... FROM ... WHERE felt1=@felt1 AND felt2=felt2"

  Dim objcmd As New SqlCommand(sql1, objcon)
  objcmd.Parameters.AddWithValue("@felt1", felt1)
  objcmd.Parameters.AddWithValue("@felt2", felt2)
  objreader = objcmd.ExecuteReader
  While objreader.Read
    ...

hvor felt1 og felt2 har samme type som felterne i databasen (og man bruger "option strict") og fx den ene en string og den anden en int32.

Ok, en smule mere krævende i antal tegn, men en lettelse på sigt.
Avatar billede erikjacobsen Ekspert
04. februar 2008 - 14:45 #7
Ok, der manglede lige en abehale:

  Dim sql1 As String = "SELECT ... FROM ... WHERE felt1=@felt1 AND felt2=@felt2"
Avatar billede ravnkilde Nybegynder
04. februar 2008 - 16:22 #8
Tak for jeres gode input og løsningsforslag. Smid et svar, erikjacobsen. I fortjener pts begge to.
Avatar billede erikjacobsen Ekspert
04. februar 2008 - 17:55 #9
Nej tak, ingen point til mig.
Avatar billede ravnkilde Nybegynder
04. februar 2008 - 21:30 #10
OK. Tak for hjælpen til jer begge.
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
Kategori
Kurser inden for grundlæggende programmering

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