webForumDet fria alternativet

Parmeteriserade frågor

19 svar · 577 visningar · startad av Calevan

CalevanMedlem sedan maj 20031 173 inlägg
#1

Tänkte öka säkerheten lite och försöker därför få koll på hur man ska skriva om det hela. Tidigare såg det ut såhär:

Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "MinKoppling"

SQL = "SELECT id, login, password, name FROM tblAnv" &_
"Where login = '" & FixaTeckenIn(Request.Form("login")) & "'" &_
"AND password = '" & FixaTeckenIN(Request.Form("password")) & "'"

Set RecSet = Connect.Execute(SQL)

vilket nu då borde bli:

Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "MinKoppling"

Set Command = server.createobject("adodb.command")
Command.activeConnection = Connect

SQL = "SELECT id, login, password, name FROM tblAnv Where (login=? AND password=?)"
Command.CommandText = SQL

login = Request.Form("login")
password = Request.Form("password")

Set RecSet = Command.Execute(, array(login, password))

Koden fungerar, men är den helt rätt skriven?
Funktionen "FixaTeckenIN" gjorde så att alla ' blev '', det behöver jag altså inte göra nu längre? det nya sättet är helt säkert? 100%?
Sett någonstans att man ska skriva

ID = CLng(Request.QueryString("ID"))

Om man hämtar ett värde. Vad gör CLng? Vilka andra sådana där saker bör man känna till? (Tänkte börja använda <% Option Explicit %> och undrar lite över hur man ska deklarera alla sina variabler och konstanter)

Vill även passa på att skicka ett tack till fredrik och till OveRRidE för deras många och bra inlägg i wF i detta ämnet. Speciellt tack till OveRRidE som fått ta mycket skit när han försöker hjälpa folk i detta ämnet.

TACK!

@ndersMedlem sedan juni 200032 969 inlägg
#2

Vad gör CLng?

Bokmärk Devguru!
Du ska inte behöva ställa en sådan fråga. :)

Om du ska använda Option Explicit så måste du deklarera alla variabler med Dim innan du använder dem, svårare än så är det inte.

Vad gäller huvudfrågan om paremetrisering kan jag tyvärr inte hjälpa dig. Jag har helt enkelt aldrig provat metoden. :)

GuffaMedlem sedan juni 2004533 inlägg
#3

Ja, koden är säker mot SQL injections.

Du får bättre prestanda på anropet om du skapar parametrar med CreateParameter och lägger till parametrarna med Command.Parameters.Add(). Då behöver den inte fråga databasen vad det ska vara för datatyp på parametrarna.

CLng konverterar ett värde till datatypen Long. När man tar emot data så använder man det för att se till att datat är korrekt. Förutom att skydda mot SQL injections (om man inte använder parametrar) så får man mycket bättre felmeddelanden vid felaktiga data än om man skickar in det i databasen.

CalevanMedlem sedan maj 20031 173 inlägg
#4

@nders skrev:

Vad gör CLng?

Bokmärk Devguru!
Du ska inte behöva ställa en sådan fråga. :)

ujuj, har ju den sidan i mina bokmärken, ska genast kolla!

@nders skrev:

Om du ska använda Option Explicit så måste du deklarera alla variabler med Dim innan du använder dem, svårare än så är det inte.

ok, tack!

Guffa skrev:

Ja, koden är säker mot SQL injections.

bra, tack!

Guffa skrev:

Du får bättre prestanda på anropet om du skapar parametrar med CreateParameter och lägger till parametrarna med Command.Parameters.Add(). Då behöver den inte fråga databasen vad det ska vara för datatyp på parametrarna.

du har inte lust att visa hur man ska skriva det? Var frågar jag databasen vad det är för datatyp? och vad gör egentligen ,-tecknet i denna rad:

Set RecSet = Command.Execute(, array(login, password))

Guffa skrev:

CLng konverterar ett värde till datatypen Long. När man tar emot data så använder man det för att se till att datat är korrekt. Förutom att skydda mot SQL injections (om man inte använder parametrar) så får man mycket bättre felmeddelanden vid felaktiga data än om man skickar in det i databasen.

ok, verkar ju vettigt att använda sådana kommandon då. vilka datatyper mer än Long är bra att känna till?

Tack!

GuffaMedlem sedan juni 2004533 inlägg
#5

Calevan skrev:

du har inte lust att visa hur man ska skriva det?

Så:

Command.Parameters.Append(Command.CreateParameter(namn, datatyp, riktning, storlek, värde)

Exempel:

Command.Parameters.Append(Command.CreateParameter("login", adVarChar, adParamInput, 50, login)

Calevan skrev:

Var frågar jag databasen vad det är för datatyp?

Det gör du inte. Drivrutinerna måste ju fråga databasen ifall du inte anger vad det är för datatyp på parametrarna.

Calevan skrev:

och vad gör egentligen ,-tecknet i denna rad:

Set RecSet = Command.Execute(, array(login, password))

Jag antar att du menar det första kommatecknet. Det separerar den första parametern i anropet ifrån den andra parametern.

Calevan skrev:

vilka datatyper mer än Long är bra att känna till?

De vanligaste är väl String, Boolean och Double.

CalevanMedlem sedan maj 20031 173 inlägg
#6

Guffa skrev:

Calevan skrev:

du har inte lust att visa hur man ska skriva det?

Så:

Command.Parameters.Append(Command.CreateParameter(namn, datatyp, riktning, storlek, värde)

Exempel:

Command.Parameters.Append(Command.CreateParameter("login", adVarChar, adParamInput, 50, login)

så om du skriver det med den koden jag gett, hur blir det då? ersätter de Command.Execute raden på något sätt?

Guffa skrev:

Calevan skrev:

och vad gör egentligen ,-tecknet i denna rad:

Set RecSet = Command.Execute(, array(login, password))

Jag antar att du menar det första kommatecknet. Det separerar den första parametern i anropet ifrån den andra parametern.

och varför har jag ingen första parameter då? eller ligger SQL raden där på något sätt? eller hur kommer SQL frågan in egentligen?

GuffaMedlem sedan juni 2004533 inlägg
#7

Calevan skrev:

så om du skriver det med den koden jag gett, hur blir det då?

Jag gjorde ju den ena parametern. Du borde kunna räkna ut hur den andra ska se ut.

Calevan skrev:

ersätter de Command.Execute raden på något sätt?

Det ersätter arrayen som du skickar in i Execute.

Calevan skrev:

och varför har jag ingen första parameter då? eller ligger SQL raden där på något sätt? eller hur kommer SQL frågan in egentligen?

Därför att du har:

Command.CommandText = SQL

CalevanMedlem sedan maj 20031 173 inlägg
#8

Blir det såhär, eller måste man lägga till parametrarna på ytterligare något sätt, tex med Command.Parameters.Add() ?

Command.CommandText = SQL

login = Request.Form("login")
password = Request.Form("password")

Command.Parameters.Append(Command.CreateParameter("login", adVarChar, adParamInput, 50, login)
Command.Parameters.Append(Command.CreateParameter("password", adVarChar, adParamInput, 50, password)

Set RecSet = Command.Execute()

har inte riktigt fattat hur man bygger upp sådana här saker ännu...tack!

GuffaMedlem sedan juni 2004533 inlägg
#9

Det fungerar fint så där.

Parameters har ingen metod som heter Add, den heter Append. Det var bara jag som skrev fel förut.

CalevanMedlem sedan maj 20031 173 inlägg
#10

danke!

CalevanMedlem sedan maj 20031 173 inlägg
#11

Får detta felet på koden ovan. rad19 är första raden med Command.Parameters.Append. vad kan felet bero på?

ADODB.Command error '800a0bb9' 

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another. 

/validate.asp, line 19
CalevanMedlem sedan maj 20031 173 inlägg
#12

Kör nu med koden

Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "MinKoppling"

Set Command = server.createobject("adodb.command")
Command.activeConnection = Connect

SQL = "SELECT id, login, password, name FROM tblAnv Where (login=? AND password=?)"
Command.CommandText = SQL

login = Request.Form("login")
password = Request.Form("password")

Set RecSet = Command.Execute(, array(login, password))

vilket fungerar fint, men hur gör jag om jag vill sätta in något i databasen?

   strSQL = "INSERT INTO tblGastbok (Namn, Inlagg, IP, Aserver, Tid) VALUES (?,?,?,?,?)"

   Command.CommandText = strSQL
   Command.Execute (, array(strNamn, strText, strIp, strServer, strTid))

genererar detta felet:

Microsoft VBScript compilation error '800a0414' 

Cannot use parentheses when calling a Sub 

/gastbok.asp, line 97 

Command.Execute (, array(strNamn, strText, strIp, strServer, strTid))
---------------------------------------------------------------------^

vad kan det bero på? hur ska jag skriva? tack!

Engine^Medlem sedan dec. 20003 887 inlägg
#13

Det första felet gissar jag är en miss i din sql-sats.

Det andra felet säger ju säg självt... antingen tar du bort dom yttre paranteserna eller så lägger du till Call

Call Command.Execute(, array(...))

Men varför inte använda CreateParameter för din insert ocskå? Det fungerar ju på samma sätt som Guffa redan visat dig.

CalevanMedlem sedan maj 20031 173 inlägg
#14

Tack, det var ordet Call jag saknade. ska testa det.

jag använder inte CreateParameter för att jag inte får det att fungera

Command.CommandText = SQL

login = Request.Form("login")
password = Request.Form("password")

Command.Parameters.Append(Command.CreateParameter("login", adVarChar, adParamInput, 50, login)
Command.Parameters.Append(Command.CreateParameter("password", adVarChar, adParamInput, 50, password)

Set RecSet = Command.Execute()

Ger fel på raden:

Command.Parameters.Append(Command.CreateParameter("login", adVarChar, adParamInput, 50, login)

så jag misstänker att det är något annat än SQL raden som ger felmedelandet:

ADODB.Command error '800a0bb9' 

Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another. 

/validate.asp, line 19

men jag vet inte vad, något förslag?

Engine^Medlem sedan dec. 20003 887 inlägg
#15

Hur ser frågan ut och vilken storlek är fältet definierat till?

CalevanMedlem sedan maj 20031 173 inlägg
#16

Frågan är den samma som i första inlägget dvs:

SQL = "SELECT id, login, password, name FROM tblAnv Where (login=? AND password=?)"

vilket fält är det du syftar på? alla fälten i databasen är 50 tecken stora.

GuffaMedlem sedan juni 2004533 inlägg
#17

Har du inkluderat adovbs.inc?

CalevanMedlem sedan maj 20031 173 inlägg
#18

nope, det hade jag inte! Tackar!

Nu fungerar parametrarna fint, tror jag fick ordning på allt. Dax att försöka välja ett svar i tråden som slutgiltligt nu bara :)

tack igen!

OveRRidEMedlem sedan feb. 200112 078 inlägg
#19

Guffa skrev:

Har du inkluderat adovbs.inc?

Jag tycker det räcker att plocka de konstanter ur denna fil som man använder. Att inkludera hela har man sällan nytta av?

CalevanMedlem sedan maj 20031 173 inlägg
#20

OveRRidE skrev:

Guffa skrev:

Har du inkluderat adovbs.inc?

Jag tycker det räcker att plocka de konstanter ur denna fil som man använder. Att inkludera hela har man sällan nytta av?

det var faktiskt precis så jag gjorde :)

258 ms totalt · 3 externa anrop · v20260731065814-full.30151723
135 ms — hämta forumlista (db)
118 ms — hämta statistik (db)
138 ms — hämta tråd, inlägg och bilagor (db)