<% kort fundering: Du har ett värde i querystring som din If-sats inte reagerar på, men ändå inte innehåller något. Exempelvis ett mellanslag. Testa det här: JAg skulle skrivit det på följande sätt: OK. Snyggare. Enkelt svar: SÄKERHET! Absolut. Indatakontroller är enormt viktigt, speciellt när det gäller webbapplikationer. Dock behövs i det här fallet inte någon konvertering, utan Isnumeric() borde vara tillräckligt. Vi kanske dock börjar glida iväg från ämnet för den här tråden, förmodligen är problemet redan löst... Just att jag typar den beror på att jag vill undvika att databasen gör detta. IsNumeric() funktionen gör som den säger. Kontrollerar om ett värde är ett tal. Du har rätt. ASP har ingen hård typning. Det var ca 4 år sedan jag senast gjorde något i klassisk asp, så jag är lite rostig... Är du ute efter sista ordet? ;o) Ha ha > > Dock behövs i det här fallet inte någon konvertering, utan Isnumeric() borde vara tillräckligt. Vill tacka för alla svar.Strull med databas och sql fråga.
If Replace(Request.QueryString("default"),"'","''") ="" or replace(request.querystring("default"),"'","''") = "Null" then
default = 1
Else
End if
Set Con = Server.CreateObject("Adodb.Connection")
Con.open "Driver={Microsoft Access Driver (*.mdb)};Dbq=" & Server.MapPath("../../../../Db/marcella.mdb") & ";"
set rst = con.execute("Select id,rubrik,sida From Marcella where id=" & request.querystring("default"))
If not rst.eof then
Response.write rst("rubrik")
Else
end if
%>
Där Id är vanliga tal så som 1,2 osv.
Där av att jag inte kör '" och "'
Men ändå får jag klagomål på id'.
med följande felmedelande:
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] Syntax error (missing operator) in query expression 'id='.
/offer/marcella/top/top.asp, line 9
Vad är då fel?Sv: Strull med databas och sql fråga.
Om ditt villkor uppfylls så ställer du ändå frågan, fast med "" eller null...fast du har satt Default till 1...??
Ska det vara så?
Vad är det du ska göra?
/bixSv: Strull med databas och sql fråga.
Du kan använda funktionen IsDigits från mitt arkiv för att kolla ifall det är ett tal.
http://www.guffa.com/Programming_archive.asp?id=13Sv: Strull med databas och sql fråga.
<CODE>
<%
If Replace(Request.QueryString("default"),"'","''") ="" or replace(request.querystring("default"),"'","''") = "Null" then
default = 1
Else
default = Request.QueryString("default")
End if
Set Con = Server.CreateObject("Adodb.Connection")
Con.open "Driver={Microsoft Access Driver (*.mdb)};Dbq=" & Server.MapPath("../../../../Db/marcella.mdb") & ";"
set rst = con.execute("Select id,rubrik,sida From Marcella where id=" & default)
</CODE>
/PKSv: Strull med databas och sql fråga.
<code>
<%
Dim rs
Dim Con
Dim Default
Default = Trim(Request.QueryString("default"))
If IsNumeric(Default) Then
Default = CLng(Default)
Else
Default = 1
End If
Set Con = Server.CreateObject("Adodb.Connection")
Con.open "Driver={Microsoft Access Driver (*.mdb)};Dbq=" & Server.MapPath("../../../../Db/marcella.mdb") & ";"
Set rst = con.execute("SELECT id, rubrik, sida FROM Marcella WHERE id = " & Default
If rst.eof then
Response.Write "Post saknas för id: " & Default
Else
Response.write rst("rubrik")
End if
rst.Close
Set rst = Nothing
Con.Close
Set Con = Nothing
%>
</code>Sv: Strull med databas och sql fråga.
Men... varför konvertera default till en long? Den används ju ändå bara som en sträng sedan.Sv: Strull med databas och sql fråga.
För att förhindra "SQL inject" bör värdet vallideras och ogiltliga värden hindras i från att fyllas i SQL satsen.
Låt oss säga at det rört sig om MS SQL Server. Vilket ger möjlighet att köra flera SQL satser eftervarandra i ett anrop.
Då kan en hacker ange föjande värde:
<code>
Default ="0 DELETE FROM Marcella"
</code>
Ojsan. Han "råkade" tömma hela tabellen. Dett kräver ju att han känner till datastrukturen. Men kan ju påpeka att vi ju genom denna tråd talat om namnet för Marcella tabellen.
Okej, så det är access databas, vilket bara stödjer en SQL sats per anrop, i dagsläget. Men om han låter det vara och någon dag uppgraderar till MS SQL Server. Så finns säkerhgets hålet kvar...
Jag hoppas jag nu tydligjort att det är viktigt att validera värden. IsNumeric() funktionen undviker att fel uppstår på sidan. Givetvis kan ett fel uppstå då talet är större eller mindre än det long(16-bitars heltal/integer) tillåter.
Jag är inte insatt i hur fel på en sidan belastar servern. Men om ett fel kräver servern på mer resurser än ett fungerande anrop bör man hantera felen. Då annars detta kan användas för en DOS - "Denial of Service" attack (Man belastar servern så mycket att servern nekad användare tillträde till den).
Om man skall utveckla webbsidor så anser jag man bör lägga storvikt på säkerhet då det flesta applikationer ligger exponerade för världens "alla" hackers.
JAg tar i detta inlägg upp mycket lite om säkerhet vad det gäller programmering. Ofta fokuserar en hacker i första hand på server program varan. Vilket är "lättare" att ta ner en server med. Om inte senast service pack är installerad kan leda till att hackern kan instalera en trojan. Öppna upp systemet och ta över servern.
Om hackern inte hittar "hål" i serverprogramvare eller konfigarationen av serverprogramvaran så tror jag att server applikationer på servern kan vara ett nästa angrips punkt.
Jag tar gärna emot konstruktiv kritik om detta inlägg.
Med vänliga hällsningar - Andreas HillqvistSv: Strull med databas och sql fråga.
Med tanke på dels indatavalidering och dels serverbelastning borde man väl egentligen alltid använda typade variabler, och aldrig skriva någonting i stil med
<CODE>
Dim rs
Dim Con
Dim Default
</CODE>
Detta innebär väl att alla variabler blir Variant:s, vilket är prestandakrävande, och kan leda till att felaktiga och potentiellt farliga värden hamnar i en SQL-sats. Istället bör man använda typade variabler, t.ex.
<CODE>
Dim Default as Long
</CODE>
Just ASP-hackare verkar alltid hoppa över just detta med typning.
Finns det något särskilt skäl till detta?
/PKSv: Strull med databas och sql fråga.
Man får väl skriva en egen IsLong funktion:
<code>
Function IsLong(Value)
If IsNumeric Then
On Error Resume Next
CLng Value
IsLong = (Err.Number = 0)
End If
End Function
</code>
(Ej testad. Men "bör" funka.)
>
>Detta innebär väl att alla variabler blir Variant:s, vilket är prestandakrävande, och kan leda till att felaktiga och potentiellt farliga värden hamnar i en SQL-sats.
>Istället bör man använda typade variabler.
>
Har du arbetat mot ASP sidor?
ASP arbetar med VB script, vilket bara stödjer variant datatypen. Så du och jag har inget val att använda typade variabler. Vårt alternativ blir att övergå till ASP.NET.Sv: Strull med databas och sql fråga.
Däremot stämmer det inte det du säger angående typningen av variabler i en sql-sats. När en Long konkateneras med en sträng (i detta fall sql-satsen) görs en implicit konvertering av den till en sträng. Det enda sättet att undvika detta är att använda en s.k. parameterized query, dvs att inte skicka in sql-satsen som en sträng till databasen. Eftersom vi tidigare var inne på säkerhet, kan jag säga att parameterized queries är det absolut säkraste sättet att skicka in värden till en databas. Bland annat görs då typkontroller på alla värden som skickas in och SQL injection blir i det närmaste omöjligt. Jag tror dock att parameterized queries kräver att man använder lagrade procedurer.
Undrar förresten om problemet löste sig för killen...Sv: Strull med databas och sql fråga.
>
>Däremot stämmer det inte det du säger angående typningen av variabler i en sql-sats.
>
Vad stämmer inte? Det finns bara en datatyp Variant. Denna har flera undertyper, vilket "Long" (16-bitars heltal) är en av dem:
<code>
'VB 3/5/6 exemple kod
Public Sub TestVB()
Dim X As Variant
Debug.Print TypeName(X)
X = "1"
Debug.Print TypeName(X)
X = 1
Debug.Print TypeName(X)
X = CLng(1)
Debug.Print TypeName(X)
End Sub
'VB Script
Public Sub TestASP()
Dim X
Response.Write TypeName(X)
X = "1"
Response.Write TypeName(X)
X = 1
Response.Write TypeName(X)
X = CLng(1)
Response.Write TypeName(X)
End Sub
</code>
>När en Long konkateneras med en sträng (i detta fall sql-satsen) görs en implicit konvertering av den till en sträng.
>
Är det något fel med det?
>Det enda sättet att undvika detta är att använda en s.k. parameterized query, dvs att inte skicka in sql-satsen som en sträng till databasen.
>
Tänker du på prestanda förlusten om att göra om ett tal till text? Kräver det inte mer resurser att instansiera ett commandobjekt tilldela det parametrarna och anropa det.
>Eftersom vi tidigare var inne på säkerhet, kan jag säga att parameterized queries är det absolut säkraste sättet att skicka in värden till en databas.
>Bland annat görs då typkontroller på alla värden som skickas in och SQL injection blir i det närmaste omöjligt.
>
Jag tycker om parameterized queries. Men mitt svara berörde bara datatyper i ASP. Det är som att klaga på att en presentation om den nya matberedaren inte kan göra en pizza.
>Jag tror dock att parameterized queries kräver att man använder lagrade procedurer.
Om en sparad fråga i Access(motsvarar en vy) har parametrar kan man anropa den som om den vore en lagrade procedur.
För exempel på en sådan, se inlägg: ADODB: Command.Prepered ([ADODB: Command.Prepered])Sv: Strull med databas och sql fråga.
Jag hoppas du inte tror att jag klagar. Jag bara diskuterar.
Det enda jag egentligen invände mot var användandet av clng, som var onödigt eftersom en koll redan hade gjorts mha IsNumeric. OK, det är väl lite fånigt att anmärka på sådana detaljer som varken gör till eller från, men ibland så vill man... och det kan ju leda till långdragna diskussioner om helt andra saker...
Det var inte prestanda jag tänkte på. Det är nog betydligt mer prestandakrävande att använda command-objekt. Anledningen till att jag förespråkar detta är istället säkerhetsaspekterna. Anledningen till att jag gled in på säkerhet var ditt tidigare inlägg om sql injection. Bygger man webbapplikationer bör man tänka på detta och då är det bra att ta för vana att använda parameterized queries.
Nu måste du skriva något riktigt kontroversiellt för att jag ska svara.Sv: Strull med databas och sql fråga.
>Bygger man webbapplikationer bör man tänka på detta och då är det bra att ta för vana att använda parameterized queries.
>
Håller fullständigt med dig vad det gäller det. Men den som använder refres metoden på parameter collectionen för commandobjekt skall skämas.
Gör du det?Sv: Strull med databas och sql fråga.
Jag förespråkar att man ska se till att variablerna <b>alltid</b> innehåller en viss datatyp. Just eftersom VBScript saknar typade variabler så bör man hålla hårt på datatyperna.
Jag döper mina variabler efter datatypen som de ska innehålla, på Microsoft-maner:
Dim objRS, objCon, lngDefault
Det är ganska vanligt att man får problem med datatyperna ifall man inte håller efter dem. Jag tror att det vanligaste är att jämförelser inte fungerar, eftersom man jämför en sträng med ett tal.Sv: Strull med databas och sql fråga.
SKa skriva ut och läsa dom.
Sitter på skolan där jag studerar och där får vi inte sitta längre mer än 16:00 då vi slutar på fredag.
Men vill tacka alla och ska läsa alla inlägg.
Bara på 5 dagar har jag fått över 14 svar på min fråga.
Så många på så kort tid har jag alldrig fått när jag har ställt en fråga.
Har fått så här många inlägg 14 på kanske 2-3 månader efteråt att jag fråga om problem lösning.
Jag vill tacka alla.