|
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | slet fra database ??? Fra : Lars |
Dato : 13-06-06 00:15 |
|
Hej jeg vil gerne slette en post fra min database og har brugt eks. på
html.dk
men jeg for fejl...
Koden ser sådan ud
<%
del = Request.form("sletbruger")
Set Conn = Server.CreateObject("ADODB.Connection")
DSN = "DRIVER={Microsoft Access Driver (*.mdb)}; "
DSN = DSN & "DBQ=" & Server.MapPath("/db/database.mdb")
Conn.Open DSN
' SQL sletter record
strSQL = "Delete from user where Id = del "
Conn.Execute(strSQL)
' Luk databaseforbindelse
Conn.Close
Set Conn = Nothing
%>
Hvis jeg skriver et tal i stedet for "del" så virker det fint.
Databasen kommer med flg fejlmelding
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected
1.
Hvor går der ged i den ????
mvh Lars
| |
Jens Peter Rosenkvis~ (13-06-2006)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Jens Peter Rosenkvis~ |
Dato : 13-06-06 00:49 |
|
Lars wrote:
>
> del = Request.form("sletbruger")
> [snip noget kode]
> strSQL = "Delete from user where Id = del "
Sådan her, prøver databasen, at finde rækkerne, hvor Id hedder "del".
Så du skal nok rette til noget i stil med:
strSQL = "Delete from user where Id = " & del
Men du skal nok sørge for at tjekke inputtet for om det er et tal.
Ellers kunne en snedig bruger sætte formen til noget i stil med:
1 OR 1 = 1
Og så bliver hele tabellen slettet.
--
Why do fireflies die so soon?
http://www.jensercube.dk/sig.asp
| |
SJ (13-06-2006)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : SJ |
Dato : 13-06-06 01:12 |
|
Jens Peter Rosenkvist wrote:
> Lars wrote:
>>
>> del = Request.form("sletbruger")
>> [snip noget kode]
>> strSQL = "Delete from user where Id = del "
>
> Sådan her, prøver databasen, at finde rækkerne, hvor Id hedder "del".
> Så du skal nok rette til noget i stil med:
>
> strSQL = "Delete from user where Id = " & del
>
> Men du skal nok sørge for at tjekke inputtet for om det er et tal.
> Ellers kunne en snedig bruger sætte formen til noget i stil med:
>
> 1 OR 1 = 1
>
> Og så bliver hele tabellen slettet.
>
>
En bedre idé ville nok være at lære hvad SQL Injection er for en
størrelse -- Det er første skridt mod at blive en god Webudvikler :)
prøv: http://en.wikipedia.org/wiki/SQL_injection
Så skal du nok klare dig i fremtiden :)
SJ
| |
Jens Gyldenkærne Cla~ (13-06-2006)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 13-06-06 13:09 |
|
Lars skrev:
> Jeg har prøvet, at udskrive "del" den viser godt nok et tal
> (database id)
Udskriv hele sql-sætningen efter at du har hæftet id-værdien på. Så
er det lettere at se efter fejl.
Se hvordan det kan gøres her: < http://asp-faq.dk/article/?id=41>.
> Tallet 48 er hentet fra et formfelt..... Kan det have noget,
> at gøre med, at
> databasen opfatter 48 som en tekst ????
Ikke medmindre at du har brugt anførselstegn om værdien.
Det er vigtigt at skelne mellem asp og databasen når man skal finde
ud af hvilken type der skal anvendes.
I asp-sammenhæng er en sql-kommando bare en tekststreng. I forhold
til databasen er det afgørende om der er anførselstegn (i sql-
sammenhæng er det apostroffer, ikke dobbelte anførselstegn) eller
ej.
Eksempel:
strSQL = "SELECT * FROM tblTest WHERE talfelt = 42 AND tekst = 'X'"
I forhold til asp er hele sql-strengen en samlet tekststreng. Når
den kommer til databasen, bliver 42 behandlet som et tal, mens X
bliver behandlet som en tekst, på grund af anførselstegnene.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Jens Gyldenkærne Cla~ (14-06-2006)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 14-06-06 15:25 |
|
Jens Peter Rosenkvist skrev:
> Nej, det behøver man nu ikke.
> Prøv og kør det. Det fungerer skam.
Ingen tvivl om at det fungerer - men det er ikke en sikker løsning.
> Når man erstatter ' med '' i inputtet, forhindrer man brugeren
> i at lave SQL syntax
Nej - langt fra. Apostrof-erstatningen er vigtig når man arbejder
med tekstfelter, men det er ikke tiltrækkeligt når man indsætter
tal-indhold.
Hvis vi tager udgangspunkt i dit eksempel fra før:
| Dim strID, strSQL
| strID = Replace(Request.Form("Fieldname"),"'","''")
|
| strSQL = "DELETE FROM [Table] WHERE [ID] = " & strID & ";"
- og sætter strID til "0 OR 1=1" - så får du slettet hele tabellen,
også selv om du erstatter apostroffer i strID (bemærk at der ingen
anførselstegn er i strID).
> Man kunne godt tjekke for, om det er et tal, men så er der
> ingen grund til at erstatte med ''.
Korrekt.
> Erstatningsmetoden duer for alle input.
Nej - jf. ovenstående.
--
Jens Gyldenkærne Clausen
Svar venligst under det du citerer, og citer kun det der er
nødvendigt for at forstå dit svar i sammenhængen. Se hvorfor og
hvordan på http://usenet.dk/netikette/citatteknik.html
| |
Lars (13-06-2006)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Lars |
Dato : 13-06-06 12:33 |
|
Jens Peter Rosenkvist skrev:
> Lars wrote:
> >
> > del = Request.form("sletbruger")
> > [snip noget kode]
> > strSQL = "Delete from user where Id = del "
>
> Sådan her, prøver databasen, at finde rækkerne, hvor Id hedder "del".
> Så du skal nok rette til noget i stil med:
>
> strSQL = "Delete from user where Id = " & del
>
> Men du skal nok sørge for at tjekke inputtet for om det er et tal.
> Ellers kunne en snedig bruger sætte formen til noget i stil med:
>
> 1 OR 1 = 1
>
> Og så bliver hele tabellen slettet.
>
Jeg har prøvet, at udskrive "del" den viser godt nok et tal (database
id)
Hvis jeg har en record med en id = 48 og skriver tallet 48 i koden
i stedet for del, så sletter den godt nok denne record og melder ikke
fejl.
Tallet 48 er hentet fra et formfelt..... Kan det have noget, at gøre
med, at
databasen opfatter 48 som en tekst ????
Jeg er ret ny i det her... Så venligst "skær" det ud i pap
Lars
| |
SJ (13-06-2006)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : SJ |
Dato : 13-06-06 12:48 |
|
Lars wrote:
> Jens Peter Rosenkvist skrev:
>
>> Lars wrote:
>>> del = Request.form("sletbruger")
>>> [snip noget kode]
>>> strSQL = "Delete from user where Id = del "
>> Sådan her, prøver databasen, at finde rækkerne, hvor Id hedder "del".
>> Så du skal nok rette til noget i stil med:
>>
>> strSQL = "Delete from user where Id = " & del
>>
>> Men du skal nok sørge for at tjekke inputtet for om det er et tal.
>> Ellers kunne en snedig bruger sætte formen til noget i stil med:
>>
>> 1 OR 1 = 1
>>
>> Og så bliver hele tabellen slettet.
>>
>
> Jeg har prøvet, at udskrive "del" den viser godt nok et tal (database
> id)
> Hvis jeg har en record med en id = 48 og skriver tallet 48 i koden
> i stedet for del, så sletter den godt nok denne record og melder ikke
> fejl.
> Tallet 48 er hentet fra et formfelt..... Kan det have noget, at gøre
> med, at
> databasen opfatter 48 som en tekst ????
>
> Jeg er ret ny i det her... Så venligst "skær" det ud i pap
>
> Lars
>
Nej, det kan ikke have noget med det at gøre. Normalt bør dette virke:
Dim strID, strSQL
strID = Replace(Request.Form("Fieldname"),"'","''")
MULIGHED 1: strSQL = "DELETE FROM [Table] WHERE [ID] = " & strID & ";"
MULIGHED 2: strSQL = "DELETE FROM [Table] WHERE [ID] = " & strID
-----
Da VBScript ikke har reele data-typer bruges istedet det der kaldes:
"Varianter". Det betyder at fortolkeren, ud fra konteksten, selv regner
ud hvilken data-type den skal bruge for en given variable. Så når du
angiver: strID = "Hello World" er StrID en Tekststreng, når du angiver
strID = 11 er StrID en Integer etc.
Håber det hjælper.
| |
![](/images/tree/0.gif) jamen (14-06-2006)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : jamen |
Dato : 14-06-06 05:56 |
|
SJ wrote:
>>> strSQL = "Delete from user where Id = " & del
>>>
>>> Men du skal nok sørge for at tjekke inputtet for om det er et tal.
>>> Ellers kunne en snedig bruger sætte formen til noget i stil med:
>>>
>>> 1 OR 1 = 1
>>>
>>> Og så bliver hele tabellen slettet.
>>>
> Nej, det kan ikke have noget med det at gøre. Normalt bør dette virke:
>
> Dim strID, strSQL
> strID = Replace(Request.Form("Fieldname"),"'","''")
>
> MULIGHED 1: strSQL = "DELETE FROM [Table] WHERE [ID] = " & strID & ";"
> MULIGHED 2: strSQL = "DELETE FROM [Table] WHERE [ID] = " & strID
>
Det kan godt være det er tidligt, men jeg kan ikke se, hvordan den
replace kan forhindre det sql injektion eksempel du kommer med. Du er
nok nødt til at udføre tjekket: er input et tal?
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) Jens Peter Rosenkvis~ (14-06-2006)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Jens Peter Rosenkvis~ |
Dato : 14-06-06 13:24 |
|
jamen wrote:
>> Dim strID, strSQL
>> strID = Replace(Request.Form("Fieldname"),"'","''")
>>
>> MULIGHED 1: strSQL = "DELETE FROM [Table] WHERE [ID] = " & strID & ";"
>> MULIGHED 2: strSQL = "DELETE FROM [Table] WHERE [ID] = " & strID
>>
>
> Det kan godt være det er tidligt, men jeg kan ikke se, hvordan den
> replace kan forhindre det sql injektion eksempel du kommer med. Du er
> nok nødt til at udføre tjekket: er input et tal?
Nej, det behøver man nu ikke.
Prøv og kør det. Det fungerer skam.
Når man erstatter ' med '' i inputtet, forhindrer man brugeren i at lave
SQL syntax - hvilket jo er det man vil.
Man kunne godt tjekke for, om det er et tal, men så er der ingen grund
til at erstatte med ''. Men den løsning duer jo kun for felter, der skal
bruge tal som input. Erstatningsmetoden duer for alle input.
--
Why do fireflies die so soon?
http://www.jensercube.dk/sig.asp
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) ![](/images/tree/0.gif) Michael Zedeler (14-06-2006)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Michael Zedeler |
Dato : 14-06-06 13:39 |
|
Jens Peter Rosenkvist wrote:
> jamen wrote:
>
>>> Dim strID, strSQL
>>> strID = Replace(Request.Form("Fieldname"),"'","''")
>>>
>>> MULIGHED 1: strSQL = "DELETE FROM [Table] WHERE [ID] = " & strID & ";"
>>> MULIGHED 2: strSQL = "DELETE FROM [Table] WHERE [ID] = " & strID
>>>
>>
>> Det kan godt være det er tidligt, men jeg kan ikke se, hvordan den
>> replace kan forhindre det sql injektion eksempel du kommer med. Du er
>> nok nødt til at udføre tjekket: er input et tal?
>
>
> Nej, det behøver man nu ikke.
> Prøv og kør det. Det fungerer skam.
>
> Når man erstatter ' med '' i inputtet, forhindrer man brugeren i at lave
> SQL syntax - hvilket jo er det man vil.
Der findes masser af SQL-kommandoer, hvor man ikke behøver at bruge '.
> Man kunne godt tjekke for, om det er et tal, men så er der ingen grund
> til at erstatte med ''. Men den løsning duer jo kun for felter, der skal
> bruge tal som input. Erstatningsmetoden duer for alle input.
Den virker på alle input, men den er ikke sikker.
Mvh. Michael.
--
Which is more dangerous? TV guided missiles or TV guided families?
I am less likely to answer usenet postings by anonymous authors.
Visit my home page at http://michael.zedeler.dk/
| |
Lars (13-06-2006)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : Lars |
Dato : 13-06-06 17:12 |
|
> >
>
> Nej, det kan ikke have noget med det at gøre. Normalt bør dette virke:
>
> Dim strID, strSQL
> strID = Replace(Request.Form("Fieldname"),"'","''")
>
> MULIGHED 1: strSQL = "DELETE FROM [Table] WHERE [ID] = " & strID & ";"
> MULIGHED 2: strSQL = "DELETE FROM [Table] WHERE [ID] = " & strID
>
> -----
>
> Da VBScript ikke har reele data-typer bruges istedet det der kaldes:
> "Varianter". Det betyder at fortolkeren, ud fra konteksten, selv regner
> ud hvilken data-type den skal bruge for en given variable. Så når du
> angiver: strID = "Hello World" er StrID en Tekststreng, når du angiver
> strID = 11 er StrID en Integer etc.
>
> Håber det hjælper.
1000 tak for hjælpen.... Nu virker det....
Lars
| |
john wengel (13-06-2006)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | Kommentar Fra : john wengel |
Dato : 13-06-06 22:23 |
|
Lars wrote in dk.edb.internet.webdesign.serverside.asp:
> Hej jeg vil gerne slette en post fra min database og har brugt eks. på
> html.dk
> men jeg for fejl...
> Koden ser sådan ud
>
> <%
> del = Request.form("sletbruger")
Det tyder på at der ikke modtages noget input fra din form.
Er din html form skrevet med response.write "<form method=""post""
action=""filnavn"" m.m.>"
- så prøv istedet at skrive din form i ren html sådan:
%>
<form method=post action="filnavn.asp" >
<input type="text" name="sletbruger">
<input type ="submit" value="etellerandet">
</form>
<%
>
> Hvor går der ged i den ????
>
> mvh Lars
>
--
Vil du lære at kode HTML, XHTML, CSS, SSI, ASP eller ASP.NET?
- Pædagogiske tutorials på dansk
- Kom godt i gang med koderne
KLIK HER! => http://www.html.dk/tutorials
| |
|
|