/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Undgå SQL injections?
Fra : John


Dato : 13-06-08 17:58

Det er så småt ved at gå op for mig, at jeg sikkert ikke har tænkt nok over
dette på min webside, men jeg er heller ikke sikker på i hvor stort et
omfang det er et problem for mig.

Kan man lave SQL injections i et VARCHAR MySQL felt eller er det kun
nummériske felter der er sårbare?

F.eks. kan jeg ikke se problemet i, at en hacker skriver "username; drop
table users" som login navn i en login form. Selvfølgelig kunne jeg kigge på
om der er specialtegn i loginnavnet, men hvorfor skulle jeg? Det ville
naturligvis være meget smart, at validére alle input således, at de manks
kan være f.eks. 100 tegn lang (lidt substr), så man ikke nemt kan lave noget
overflow.

Og hvad gør man i de tilfælde, hvor man har et MySQL text felt, hvor der kan
stå alt muligt i - hvordan validéres det?



 
 
Stig Johansen (13-06-2008)
Kommentar
Fra : Stig Johansen


Dato : 13-06-08 19:07

John wrote:

> F.eks. kan jeg ikke se problemet i, at en hacker skriver "username; drop
> table users" som login navn i en login form.

Den dag du skifter DB, eller mySQL understøtter det, kan du muligvis få et
problem.

Generelt bør man altid bruge paramaterized, eller prepared queries, som det
også kaldes, så er dén ged barberet.

Uden at kende særlig meget til PHP, tror jeg nok man kalder det
'placeholders' der.

--
Med venlig hilsen
Stig Johansen

John (13-06-2008)
Kommentar
Fra : John


Dato : 13-06-08 20:45

>> F.eks. kan jeg ikke se problemet i, at en hacker skriver "username; drop
>> table users" som login navn i en login form.
>
> Den dag du skifter DB, eller mySQL understøtter det, kan du muligvis få et
> problem.

Det anser jeg nu ikke som et problem på min lille webside, da jeg (hvis jeg
skifter DB) helt sikkert også vil skulle genskrive min kode. Det er så
selvfølgelig pga. dårlig genbrugbar kode fra min side men mon ikke det er
sådan de fleste gør det? På et stort firma site er det naturligvis en anden
sag, hvor man nok godt kan finde på at skifte DB.

> Generelt bør man altid bruge paramaterized, eller prepared queries, som
> det
> også kaldes, så er dén ged barberet.
> Uden at kende særlig meget til PHP, tror jeg nok man kalder det
> 'placeholders' der.

Ikke helt forstået - hvad går det ud på?



Christen Fihl (13-06-2008)
Kommentar
Fra : Christen Fihl


Dato : 13-06-08 22:46

Et eksempel

Antag du validerer login med
select * from Users where Name=" <fld1> " and password=" <fld2> "
hvor <fld1> og <fld2> kommer fra formen

Hvis jeg nu skriver
<fld1> som Kurt" or 1=1 --
<fld2> som xxx

så får du et udtryk der nu er
select * from Users where Name="Kurt" or 1=1 --" and password="xxx"
og det giver ret så mange rækker når -- (en kommentar) fjerner en del af
betingelserne

Hvis du som Stig skriver pakker det pænt ind, da bliver " lavet om til
"" og andet godt
select * from Users where Name="Kurt"" or 1=1 --" and password="xxx"
Så nu er navnet alt herefter på linien: Kurt"" or 1=1 --

Christen Fihl



John (13-06-2008)
Kommentar
Fra : John


Dato : 13-06-08 23:32

> Antag du validerer login med
> select * from Users where Name=" <fld1> " and password=" <fld2> "
> hvor <fld1> og <fld2> kommer fra formen
>
> Hvis jeg nu skriver
> <fld1> som Kurt" or 1=1 --
> <fld2> som xxx
>
> så får du et udtryk der nu er
> select * from Users where Name="Kurt" or 1=1 --" and password="xxx"
> og det giver ret så mange rækker når -- (en kommentar) fjerner en del af
> betingelserne

Det får jeg det nu ikke helt til, da din <fld1> stadigt vil blive pakket ind
i ", hvilket skulle give dette resultat:
select * from Users where Name="Kurt" or 1=1 --" and password="xxx"

Selv uden " bliver det til:
select * from Users where Name="Kurt or 1=1 --" and password="xxx"

... hvilket heller ikke giver et uønsket resultat, da det netop altid
afsluttes med ".

> Hvis du som Stig skriver pakker det pænt ind, da bliver " lavet om til ""
> og andet godt
> select * from Users where Name="Kurt"" or 1=1 --" and password="xxx"
> Så nu er navnet alt herefter på linien: Kurt"" or 1=1 --

Det forstår jeg ikke?



Bertel Lund Hansen (13-06-2008)
Kommentar
Fra : Bertel Lund Hansen


Dato : 13-06-08 23:37

John skrev:

> Det får jeg det nu ikke helt til, da din <fld1> stadigt vil blive pakket ind
> i ", hvilket skulle give dette resultat:
> select * from Users where Name="Kurt" or 1=1 --" and password="xxx"

Ja, men du ser ikke rigtigt hvad der står.

   select * from Users where <én betingelse> or <altid sand>

og efterfølgense står der det tegn der betyder "comment" så
resten af linjen ignoreres - inklusive det anførselstegn der
burde have været det normale sluttegn, men ikke bliver det fordi
man i navnet har inkluderet en anførselstegn.

Der selectes altså alle usere overhovedet.

--
Bertel
http://bertel.lundhansen.dk/      FIDUSO: http://fiduso.dk/

John (14-06-2008)
Kommentar
Fra : John


Dato : 14-06-08 00:30

>> Det får jeg det nu ikke helt til, da din <fld1> stadigt vil blive pakket
>> ind
>> i ", hvilket skulle give dette resultat:
>> select * from Users where Name="Kurt" or 1=1 --" and password="xxx"
>
> Ja, men du ser ikke rigtigt hvad der står.
> select * from Users where <én betingelse> or <altid sand>
>
> og efterfølgense står der det tegn der betyder "comment" så
> resten af linjen ignoreres - inklusive det anførselstegn der
> burde have været det normale sluttegn, men ikke bliver det fordi
> man i navnet har inkluderet en anførselstegn.
>
> Der selectes altså alle usere overhovedet.

Jeg forstår skam godt hvad der står og burde ske, men det fungere ikke:

Hvis jeg har følgende SQL fra min db:
SELECT * FROM users WHERE login='kurt' or 1=1 --' AND psw='xxx'

får jeg denne fejl:

#1064 - You have an error in your SQL syntax; check the manual that
corresponds to your MySQL server version for the right syntax to use near
'xxx'' at line 1
ERROR: Unclosed quote @ 73
STR: '



Bertel Lund Hansen (14-06-2008)
Kommentar
Fra : Bertel Lund Hansen


Dato : 14-06-08 00:44

John skrev:

> Hvis jeg har følgende SQL fra min db:
> SELECT * FROM users WHERE login='kurt' or 1=1 --' AND psw='xxx'

> får jeg denne fejl:

Okay. Er -- da ikke tegnet for en kommentar? Eller tjekker
systemet syntaks også i kommentarer?

--
Bertel
http://bertel.lundhansen.dk/      FIDUSO: http://fiduso.dk/

Stig Johansen (14-06-2008)
Kommentar
Fra : Stig Johansen


Dato : 14-06-08 06:41

Bertel Lund Hansen wrote:

> John skrev:
>
>> Hvis jeg har følgende SQL fra min db:
>> SELECT * FROM users WHERE login='kurt' or 1=1 --' AND psw='xxx'
>
>> får jeg denne fejl:
>
> Okay. Er -- da ikke tegnet for en kommentar?

Det er det i MS SQLServer, og der er ';' line terminator, så der bruger
"man" ;--.

Jeg faldt i øvrigt over dette skriv
<http://www.net-security.org/dl/articles/IntegrigyIntrotoSQLInjectionAttacks.pdf>
som efter min mening giver et rimeligt generelt overblik.

--
Med venlig hilsen
Stig Johansen

John (14-06-2008)
Kommentar
Fra : John


Dato : 14-06-08 17:29

>>> Hvis jeg har følgende SQL fra min db:
>>> SELECT * FROM users WHERE login='kurt' or 1=1 --' AND psw='xxx'
>>
>>> får jeg denne fejl:
>>
>> Okay. Er -- da ikke tegnet for en kommentar?
>
> Det er det i MS SQLServer, og der er ';' line terminator, så der bruger
> "man" ;--.
>
> Jeg faldt i øvrigt over dette skriv
> <http://www.net-security.org/dl/articles/IntegrigyIntrotoSQLInjectionAttacks.pdf>
> som efter min mening giver et rimeligt generelt overblik.

Så tilbage til mit spørgsmål - hvad er faren i det med et text felt i MySQL?



Stig Johansen (14-06-2008)
Kommentar
Fra : Stig Johansen


Dato : 14-06-08 18:35

John wrote:

> Så tilbage til mit spørgsmål - hvad er faren i det med et text felt i
> MySQL?

Det kommer an på hvordan du har kodet det.
Her er lidt flere eksempler, også mySQL:
<http://ferruh.mavituna.com/sql-injection-cheatsheet-oku/>

--
Med venlig hilsen
Stig Johansen

Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409083
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste