/ 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
Hvornår bruge addslashes?
Fra : Stig Nørgaard Jepsen


Dato : 02-05-01 12:53

Jeg vil lige høre om der skulle være nogen grund til at bruge addslashes på
variabler som ikke input'es på en hjemmeside?
Altså med andre ord - Er det ikke kun de variabler som får deres indhold af
en form man giver addslashes?

Er der andre gode sikkerhedsråd til når man programmere i php - sådan
generelt?

Mvh Stig N. Jepsen



 
 
Stefan Bruhn (02-05-2001)
Kommentar
Fra : Stefan Bruhn


Dato : 02-05-01 13:29

On Wed, 2 May 2001 13:52:55 +0200, "Stig Nørgaard Jepsen"
<stignj@mail.dk> wrote:

>Jeg vil lige høre om der skulle være nogen grund til at bruge addslashes på
>variabler som ikke input'es på en hjemmeside?
>Altså med andre ord - Er det ikke kun de variabler som får deres indhold af
>en form man giver addslashes?
>
>Er der andre gode sikkerhedsråd til når man programmere i php - sådan
>generelt?

Du bruger svjv kun addslashes når noget skal sættes ind i en database.

--
Mvh. Stefan
Website: http://ghashul.dk/
"I demand the right to keep and arm bears"
"A computer without Windows, is like a fish without a bicycle"

Jacob Bunk Nielsen (02-05-2001)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 02-05-01 15:07

Stefan Bruhn <if.you.want.my.e-mail.look@my.message.headers.ghashul.dk> writes:

> Du bruger svjv kun addslashes når noget skal sættes ind i en database.

Det er i hvert fald hvad den er beregnet til.
http://dk.php.net/manual/en/function.addslashes.php står der:

Returns a string with backslashes before characters that need to be
quoted in database queries etc. These characters are single quote ('),
double quote ("), backslash (\) and NUL (the null byte).

Man kan dog også have glæde af den, hvis man vil outputte PHP-kode (hvor
mærkeligt det end måtte lyde, så sker den slags også :) ...

--
Jacob

Troels Arvin (02-05-2001)
Kommentar
Fra : Troels Arvin


Dato : 02-05-01 18:47

On Wed, 02 May 2001 13:52:55 +0200, "Stig Nørgaard Jepsen"
<stignj@mail.dk> wrote:

> Jeg vil lige høre om der skulle være nogen grund til at bruge
> addslashes på variabler som ikke input'es på en hjemmeside?
Det kommer an på

1. om din PHP har (den ret irriterende, hvis du spørger mig)
"magic_quotes_gpc" slået til; tjek output fra phpinfo() for
at undersøge det
2. om du benytter SQL, som inddrager pågældende
variable

Hvis din PHP har magic_quotes_gpc slået fra, så skal du huske at benytte
addslashes() på alle udefrakommende data inden du putter dem ind i et
SQL-udtryk.

Generelt:
Udefrakommende data (GET, POST, COOKIES) kan man ikke stole på. Derfor
skal man sikre sig, at data ikke indeholder særlige tegn, der kan
ødelægge SQL-udtryk, HTML-output, osv.

Problemet med SQL udtryk og udefrakommende data kan illustreres på
følgende vis. Lad $x være en variabel, du får udefra (fx. som resultat
af en HTML-formular). Lad $x blive benyttet til at opdatere i en
database, fx:

$SQL="
   update tabelnavn
   set lagerstatus='out'
   where something='$x'
";

Lad os sige, at en person får kringlet det således, at $x indeholder
følgende værdi:
' or 'z'='z

Det resulterende SQL-udtryk bliver nu:

$SQL="
   update tabelnavn
   set lagerstatus='out'
   where something='' or 'z'='z'
";

Bang. Alle tabellens rækker ændres, fordi det altid gør sig gældende, at
tegnet z altid er lig z.

Den rigtige måde at konstruere SQL-sætningen på ville have været:

$SQLx = addslashes($x);
$SQL="
   update tabelnavn
   set lagerstatus='out'
   where something='$SQLx'
";

Hvis du har slået magic_quotes_gpc til, vil PHP modificere alle
indkommende data inden du får adgang til dem, nemlig ved at køre dem
alle gennem addslashes(). Dette lyder umiddelbart bekvemt, men er efter
min mening en pestilens, for så skal man køre stipslashes() på alle
eksterne data, før man kan benytte dem i ikke-SQL sammenhæng.

Bemærk følgende forhold, som ved første øjekast er lidt underligt:
Hvis du har brugt addslashes() på en værdi, som du har indsat i et
SQL-udtryk, så skal man _ikke_ køre stipslashes() på samme data, når man
henter dem ud af databasen igen senere.

Bemærk også, at addslashes() ikke nødvendigvis altid er den smarteste
måde at uskadeliggøre data. Hvis vi fx. taler heltalsdata, vil det ofte
være smartere at køre værdien gennem intval() før den benyttes i et
SQL-udtryk. På den måde sikrer man sig imod, at databasen fødes tekstdata til
en kolonne af typen int.

Mere ang. uskadeliggørelse af eksternt genererede data:
Hvis du skal bruge data med ekstern oprindelse i HTML, er det ofte
vigtigt at sikre sig, at data ikke indeholder HTML-særlige tegn, der kan
resultere i HTML med syntaksfejl. Jeg taler her om tegnene <>&. Hvis
sådanne tegn optræder i HTML eller JavaScript, kan slutresultatet blive
en meget grim side - eller det, der er værre: i JavaScript, der afvikler
farlige handlinger. Man kunne fx. forestille sig et message-board, hvor
en ond post'er for sneget særlige tegn ind, der gør at andre message
board brugeres browsere udfører handlinger, der ikke er rare - og som
udvikleren af message-board'et så vil blive klandret for.

--
Greetings from Troels Arvin, Copenhagen, Denmark

Peter Brodersen (02-05-2001)
Kommentar
Fra : Peter Brodersen


Dato : 02-05-01 19:33

On Wed, 02 May 2001 19:47:19 +0200, "Troels Arvin" <troels@arvin.dk>
wrote:

>Dette lyder umiddelbart bekvemt, men er efter
>min mening en pestilens, for så skal man køre stipslashes() på alle
>eksterne data, før man kan benytte dem i ikke-SQL sammenhæng.

Endnu et problem er, at man bliver forventningsfuld, når man smider
data ind i databaser, og glemmer at bruge addslashes i andre tilfælde
- fx:

1. Når man henter systemvariabler eller HTTP-headers fra brugeren (fx
$HTTP_USER_AGENT) - har været ude for at et statistik-script fejlede
lidt, fordi en User-Agent hed noget med et '-tegn i sig; heldigvis fik
jeg om ikke andet en e-mail med SQL-fejlen.

2. Når man manuelt flytter data fra en tabel til en anden - fx først
laver en query, der udtrækker nogle felter til variable, og derefter
bruger de variable i en ny query, der indsætter data igen.

Begge af ovenstående situationer er sjældne, og derfor i højere grad
noget, man ikke lige skelner en tanke, når man endelig befinder sig i
dem.

--
- Pede
Professionel nørd

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

Månedens bedste
Årets bedste
Sidste års bedste