Avatar billede s0mmer Nybegynder
03. januar 2009 - 00:58 Der er 9 kommentarer og
1 løsning

Command objektet

Hej Eksperter,

Jeg er før blevet rådet til at bruge Command objektet, men ku godt bruge lidt hjælp til at få det ændret.

Jeg vil gerne ændre flg:
<%
set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=SQLOLEDB;Data Source=xx;Initial Catalog=xx;User Id=xx;Password=xx;"

    SQL = "select * from Featurestories where ID = " & Request("ID")
    Set RS = Conn.Execute(SQL)

    Var_Text1 = RS("Text1")
    Var_Text7 = RS("Text7")   
    Var_Note1 = RS("Note1")

    RS.Close
    Set RS = Nothing
    Conn.Close
    Set Conn = Nothing
%>

Til formen:
    set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Open "Provider=SQLOLEDB;Data Source=xx;Initial Catalog=xx;xxId=xx;Password=xx;"
    strSQL = "SELECT * FROM customers WHERE ([ID] = ?)"

    set cmd = Server.CreateObject("ADODB.Command")
    set cmd.ActiveConnection = Conn
    cmd.CommandType = adCmdText
    cmd.CommandText = strSQL
    cmd.Parameters.Append cmd.CreateParameter("@ID", adVarChar, adParamInput, 255, Session("userID"))
    Set rs = cmd.Execute()


Det burde ik være så svært for en der har lidt mere forstand på asp end jeg :) På forhånd tak
Avatar billede softspot Forsker
03. januar 2009 - 03:14 #1
Det er ikke umiddelbart så svært. Jeg vil mene dette er måden:

<%
    set Conn = Server.CreateObject("ADODB.Connection")
    Conn.Open "Provider=SQLOLEDB;Data Source=xx;Initial Catalog=xx;xxId=xx;Password=xx;"
    strSQL = "select * from Featurestories where ([ID] = ?)"

    set cmd = Server.CreateObject("ADODB.Command")
    set cmd.ActiveConnection = Conn
    cmd.CommandType = adCmdText
    cmd.CommandText = strSQL
    cmd.Parameters.Append cmd.CreateParameter("@ID", adVarChar, adParamInput, 255, Request("ID"))
    Set rs = cmd.Execute()
    Var_Text1 = RS("Text1")
    Var_Text7 = RS("Text7")   
    Var_Note1 = RS("Note1")

    RS.Close
    Set RS = Nothing
    Conn.Close
    Set Conn = Nothing
%>
Avatar billede s0mmer Nybegynder
03. januar 2009 - 12:32 #2
softspot > men giver du mig ret i at der er mulighed for sql injections i den oprindelig kode? og at det er en god idé at ændre til command objektet?
Avatar billede s0mmer Nybegynder
03. januar 2009 - 12:41 #3
softspot > og hvis det ikke er eks. ID = noget.. men LIKE, er dette så korrekt:

strSQL = "SELECT * FROM Customers where ([email] LIKE ?)"
Avatar billede softspot Forsker
03. januar 2009 - 12:44 #4
Der er i allerhøjeste grad risiko for injetions i den oprindelige kode (det er faktisk et klassisk eksempel på SQL som er åben for injections).

Jeg er af den opfattelse, at med mindre der er tale om helt simple eller totalt statiske SQL-sætninger, der skal udføres mod databasen, så skal det laves med command-objektet frem for en direkte tilgang. Der kan naturligvis være undtagelser som taler for den direkte tilgang (f.eks. af performancemæssige grunde, da conn.execute alt andet lige er hurtigere til enkeltstående databasekald). Men i disse tilfælde må man så forberede sig på at lave en del af benarbejdet omkring validering mod injetions selv.
Avatar billede softspot Forsker
03. januar 2009 - 12:47 #5
Vedr. 03/01-2009 12:41:00, så har jeg faktisk ikke arbejdet så meget med LIKE i command-objektet uden at vide på forhånd hvor mine wildcards skulle placeres i fht. parameteren, men jeg vil da tro det fungerer på den måde du viser, hvor værdien af parameteren så indeholder de wildcards der skal benyttes.

Eksempelvis:


set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "Provider=SQLOLEDB;Data Source=xx;Initial Catalog=xx;xxId=xx;Password=xx;"
strSQL = "SELECT * FROM Customers where ([email] LIKE ?)"

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = Conn
cmd.CommandType = adCmdText
cmd.CommandText = strSQL
cmd.Parameters.Append cmd.CreateParameter("@email", adVarChar, adParamInput, 255, "%" & Request("emailpart") & "%")
Set rs = cmd.Execute()
'... osv...
Avatar billede s0mmer Nybegynder
03. januar 2009 - 12:59 #6
softspot > du har fortjent points i begge mine tråde nu, men jeg har lige nogle spørgsmål (jeg håber det er ok?)

1.
hvis jeg skal indsætte en værdi istedet for at referere til noget request eller lign, skal det så i '' eller "" eller bare stå uden? eks:

cmd.Parameters.Append cmd.CreateParameter("@ID", adVarChar, adParamInput, 255, "min værdi")

2.
hvis der er åbnet for databasen og en rigtig lang kode laver nogle Conn.execute (i oprindelige kode!) flere steder i if sætningen og jeg ønsker at erstatte det med command tilgange. Så skal jeg lave hele cmd rækkefølgen hver gang der bare er en linjes Conn.execute ikke sandt?
eks:
    'Conn.Execute("Delete FROM Customers where ID = "&Var_ID)

ville blive erstattet med:
    strSQL = "DELETE FROM Customers where ([ID] = ?)"
    set cmd = Server.CreateObject("ADODB.Command")
    set cmd.ActiveConnection = Conn
    cmd.CommandType = adCmdText
    cmd.CommandText = strSQL
    cmd.Parameters.Append cmd.CreateParameter("@ID", adVarChar, adParamInput, 255, Var_ID)
    Set RS = cmd.Execute()
Avatar billede softspot Forsker
03. januar 2009 - 13:20 #7
Ad 1. Hvis det er en konstant streng du vil putte i parameteren, så skal den følge syntaksen for en VBScript-streng, dvs. "min værdi". Hvis det er et tal, skal der ikke nogen afgrænser omkring værdien. Er det en variabel skal der naturligvis heller ikke noget omkring...

Ad 2. Jo, det er korrekt, men der vil jeg da anbefale at du lige kigger på mit forelag i den anden tråd (vedr. indpakning af command-initialiseringen), det vil gøre arbejdet lidt mere overkommeligt: http://www.eksperten.dk/spm/858335#rid7292285
Avatar billede s0mmer Nybegynder
05. januar 2009 - 18:48 #8
softspot > mange tak for hjælpen. send svar og du får points :) læg venligst mærke til en tråd jeg opretter nu. igen noget du kan svare på :)
Avatar billede softspot Forsker
05. januar 2009 - 22:38 #9
Velbekomme :-)
Avatar billede softspot Forsker
07. januar 2009 - 23:07 #10
Tak for point :)
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