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.
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.
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?
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
Microsoft VBScript compilation error '800a0414'
Cannot use parentheses when calling a Sub
/gastbok.asp, line 97
Command.Execute (, array(strNamn, strText, strIp, strServer, strTid))
---------------------------------------------------------------------^
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