|
| SQL Sikkerhed Fra : Harald |
Dato : 20-09-03 12:06 |
|
Hej
Jeg har en side som benytter php og MySQL. Nogle af siderne kaldes bla.
sådan:
minside.php?Idnr=35
I php´en kaldes så noget i denne stil:
SELECT * FROM mintabel
WHERE IDNUMMER=Idnr
Er det her muligt at lave noget fusk ved f.eks. at kalde min php sådan
minside.php?Idnr=35 og så nogle yderligere SQL kald
Mvh
HK
| |
Harald (20-09-2003)
| Kommentar Fra : Harald |
Dato : 20-09-03 12:11 |
|
"Harald" <news3@kroning.dk> skrev i en meddelelse
news:3f6c3489$0$24713$edfadb0f@dread14.news.tele.dk...
> Hej
>
> Jeg har en side som benytter php og MySQL. Nogle af siderne kaldes bla.
> sådan:
>
> minside.php?Idnr=35
>
> I php´en kaldes så noget i denne stil:
>
> SELECT * FROM mintabel
> WHERE IDNUMMER=Idnr
>
> Er det her muligt at lave noget fusk ved f.eks. at kalde min php sådan
>
> minside.php?Idnr=35 og så nogle yderligere SQL kald
Vil lige nævne at den version at MySQL jeg bruger nu (3) ikke understøtter
UNION men jeg kunne jo finde på at opgradere senere.
/HK
| |
Troels Arvin (20-09-2003)
| Kommentar Fra : Troels Arvin |
Dato : 20-09-03 16:07 |
|
On Sat, 20 Sep 2003 13:05:44 +0200, Harald wrote:
> Er det her muligt at lave noget fusk
Det afhænger af, hvorledes din PHP-kode ser ud. Prøv PHP-gruppen.
--
Greetings from Troels Arvin, Copenhagen, Denmark
| |
Peter Brodersen (20-09-2003)
| Kommentar Fra : Peter Brodersen |
Dato : 20-09-03 16:56 |
|
On Sat, 20 Sep 2003 13:05:44 +0200, "Harald" <news3@kroning.dk> wrote:
>I php´en kaldes så noget i denne stil:
>
>SELECT * FROM mintabel
>WHERE IDNUMMER=Idnr
>
>Er det her muligt at lave noget fusk ved f.eks. at kalde min php sådan
Hvis du bruger dataen direkte, så vil det være muligt at "fuske".
Fusk er dog et vidt begreb. I dette SELECT-tilfælde kan brugeren,
såvidt jeg kan se, ikke tilvælge flere felter, heller ikke med
subselects eller derived tables. Brugeren kan dog forårsage at der
bliver valgt en anden række end oprindeligt tiltænkt, ved at omgå
WHERE-linjen, fx med nogle passende OR-udsagn. Med UNION kan man dog
få flere linjer ud, men såvidt, jeg ved, ikke fx lave INSERTs eller
lignende.
Det kan selvfølgelig også være slemt nok, hvis det fx er en query, der
tjekker brugernavn og kodeord op imod en database, at brugeren kan
vælge, at den bare skal hive en række ud, uanset hvad brugernavnet og
kodeordet er.
Alt afhængigt af klienten vil brugeren derimod ikke have mulighed for
fx at slette rækker ved at hælde flere queries på. I en normal
MySQL-klient vil man kunne bruge ";", "\g" og "\G" for at
afslutte/adskille flere queries - det er dog blot en query-adskiller,
og har ikke noget direkte med MySQL at gøre. I PHPs MySQL-klient vil
denne mulighed med flere queries normalt ikke være tilstede, så folk
kan ikke hælde fx en INSERT- eller DELETE-query på bagefter.
Når det så er sagt, så er der ingen grund til ikke at validere
brugerinputtet. Det kan fx gøres ved at sikre sig at inputtet er et
heltal (alternativt bare tvinge inputtet til at være et heltal), eller
smide værdien i enkelt-quotes, og sørge for at brugerinputtet er
escape'd passende.
Dette varierer så fra sprog til sprog
--
- Peter Brodersen
Ugens sprogtip: terabyte (og ikke terrabyte)
| |
Johan Holst Nielsen (20-09-2003)
| Kommentar Fra : Johan Holst Nielsen |
Dato : 20-09-03 17:19 |
|
Harald wrote:
> Jeg har en side som benytter php og MySQL. Nogle af siderne kaldes bla.
> sådan:
>
> minside.php?Idnr=35
>
> I php´en kaldes så noget i denne stil:
>
> SELECT * FROM mintabel
> WHERE IDNUMMER=Idnr
>
> Er det her muligt at lave noget fusk ved f.eks. at kalde min php sådan
>
> minside.php?Idnr=35 og så nogle yderligere SQL kald
Well, hvorfor ikke bare validere dit Idnr? F.eks. via is_numberic()
eller eventuelt noget type casting
< http://dk.php.net/manual/en/language.types.type-juggling.php#language.types.typecasting>
< http://php.net/is_numeric>
mvh
Johan
| |
Lars Linde (26-09-2003)
| Kommentar Fra : Lars Linde |
Dato : 26-09-03 14:32 |
|
"Harald" <news3@kroning.dk> wrote in message
news:3f6c3489$0$24713$edfadb0f@dread14.news.tele.dk...
> Hej
>
> Jeg har en side som benytter php og MySQL. Nogle af siderne kaldes bla.
> sådan:
>
> minside.php?Idnr=35
>
> I php´en kaldes så noget i denne stil:
>
> SELECT * FROM mintabel
> WHERE IDNUMMER=Idnr
>
> Er det her muligt at lave noget fusk ved f.eks. at kalde min php sådan
>
> minside.php?Idnr=35 og så nogle yderligere SQL kald
>
> Mvh
> HK
Hvis du ikke validerer på Idnr vil følgende kunne lade sig gøre
Prøv at skrive følgende i din URL i browseren "minside.php?Idnr=35; drop
table mintabel"
Det vil resultere i at følgende køres på din DB
SELECT * FROM mintabel WHERE IDNUMMER=35; drop table mintabel
--
Lars
| |
Peter Brodersen (26-09-2003)
| Kommentar Fra : Peter Brodersen |
Dato : 26-09-03 17:44 |
|
On Fri, 26 Sep 2003 15:31:51 +0200, "Lars Linde"
<someone@somewhere.com> wrote:
>Prøv at skrive følgende i din URL i browseren "minside.php?Idnr=35; drop
>table mintabel"
>
>Det vil resultere i at følgende køres på din DB
>
>SELECT * FROM mintabel WHERE IDNUMMER=35; drop table mintabel
Det bruges ofte som eksempel, men ";" er ikke en del af selve
query'en, og vil rent faktisk udløse en fejl.
De klienter, man dog bruger, når man manuelt fedter queries ind, vil
dog betragte ; som en delimiter, ligesom mysql-klienten også
accepterer \g og \G. Det er dog ganske enkelt bare nødvendigt for en
textmode-klient at have en måde, man kan afslutte sin query på.
Tjek også: <news:bkht9g$8st$1@dknews.tiscali.dk>
--
- Peter Brodersen
Ugens sprogtip: i dag (og ikke idag)
| |
Jens Gyldenkærne Cla~ (26-09-2003)
| Kommentar Fra : Jens Gyldenkærne Cla~ |
Dato : 26-09-03 20:55 |
|
Peter Brodersen skrev:
> Det bruges ofte som eksempel, men ";" er ikke en del af selve
> query'en, og vil rent faktisk udløse en fejl.
Gælder det alle databaser/drivere?
> Ugens sprogtip: i dag (og ikke idag)
God idé - jeg tager lige en specielt om databaser.
--
Jens Gyldenkærne Clausen
Sprogtip: Forespørgsel (hverken forspørgelse eller forespørgelse)
| |
Peter Brodersen (26-09-2003)
| Kommentar Fra : Peter Brodersen |
Dato : 26-09-03 21:40 |
|
On Fri, 26 Sep 2003 21:55:20 +0200, Jens Gyldenkærne Clausen
<jens@gyros.invalid> wrote:
>> Det bruges ofte som eksempel, men ";" er ikke en del af selve
>> query'en, og vil rent faktisk udløse en fejl.
>Gælder det alle databaser/drivere?
Det er selvfølgelig farligt at konkludere, men typisk vil en sådan
funktionalitet i et sprog jo være baseret på: "Jeg sender en kommando
afsted, som så giver mig noget materiale tilbage, for den pågældende
kommando". Her ville det ikke give så meget mening, hvis en
grundfunktion tillod flere queries, da det let kunne blive megetp
diffust med at modtage data opdelt i flere tabeller med forskellige
felter af forskellige typer.
Når det er sagt, så skal jeg ikke kunne sige, i hvor høj grad,
forskellige applikationer har abstraheret sig væk fra at kunne sende
"rå queries", så at sige. En applikation som PHPMyAdmin accepterer
uden problemer flere queries adskilt af ;
--
- Peter Brodersen
Ugens sprogtip: i dag (og ikke idag)
| |
Harald (27-09-2003)
| Kommentar Fra : Harald |
Dato : 27-09-03 06:51 |
|
Tak for svarene, jeg validere nu alle indput så misbrug skulle ikke længere
være mulig (tror jeg).
/HK
<klip>
| |
Michael Zedeler (07-02-2004)
| Kommentar Fra : Michael Zedeler |
Dato : 07-02-04 19:47 |
|
Harald wrote:
> Jeg har en side som benytter php og MySQL. Nogle af siderne kaldes bla.
> sådan:
>
> minside.php?Idnr=35
>
> I php´en kaldes så noget i denne stil:
>
> SELECT * FROM mintabel
> WHERE IDNUMMER=Idnr
>
> Er det her muligt at lave noget fusk ved f.eks. at kalde min php sådan
>
> minside.php?Idnr=35 og så nogle yderligere SQL kald
Ja. Det er det. Angrebet kaldes "SQL injection" og findes alt for mange
steder idag.
www.owasp.org er et rigtig godt sted at kigge hvis man interesserer sig
for sikre web-applikationer (hvilket de fleste vel burde interessere sig
for).
M.
| |
|
|