/ 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
Input-validering
Fra : Tommy Olsen


Dato : 17-02-03 15:37

Hej,

Da jeg er igang med at lave noget PHP, har jeg samtidigt brug for at
brugerens input fra en FORM bliver valideret ordentligt.

1) brugeren indtaster tekst som gerne må indeholde visse HTML-tags, men
ikke alle. Således at man undgår XSS-attacks og lign.

2) Teksten bliver gemt i en database.

3) Den indtastede tekst fra brugeren skal vises på en HTML-side.


Hvilke midler i henholdsvis 1, 2 og 3 skal man tage i brug for at være på
den helt sikre side, så der ikke kan laves injection- og XSS-attacks?

Hvordan gør I?

Jeg har tidligere (2år) kigget på bl.a. addslashes() og stripslashes(),
men har ikke rigtigt leget med input-validering siden, derfor ønsker jeg lidt
input fra andre om hvordan I gør.

--
Tommy Olsen

 
 
Ulrik Nielsen (17-02-2003)
Kommentar
Fra : Ulrik Nielsen


Dato : 17-02-03 16:02

Tommy Olsen wrote:
> Hej,
> 1) brugeren indtaster tekst som gerne må indeholde visse HTML-tags, men
> ikke alle. Således at man undgår XSS-attacks og lign.

http://www.php.net/manual/en/function.strip-tags.php

>
> 2) Teksten bliver gemt i en database.


lav checksumme til at checke at det du forventer kommer, faktisk også er
det der kommer.


--
>> ulrik - ulrik(@)lazy.dk
excuse of the day : Sticky bits on disk.
from bofh : http://www.cs.wisc.edu/~ballard/bofh/


Tommy Olsen (18-02-2003)
Kommentar
Fra : Tommy Olsen


Dato : 18-02-03 00:19

On Mon, 17 Feb 2003 16:01:40 +0100, Ulrik Nielsen wrote:

>>
>> 2) Teksten bliver gemt i en database.
>
> lav checksumme til at checke at det du forventer kommer, faktisk også er
> det der kommer.

Dette må du venligst gerne uddybe lidt. Hvordan skal jeg forvente hvad der
kommer hvis det er en tilfældig bruger der indtaster noget i en form?

--
Tommy Olsen

Ulrik Nielsen (18-02-2003)
Kommentar
Fra : Ulrik Nielsen


Dato : 18-02-03 09:18



Tommy Olsen wrote:
>>
>>lav checksumme til at checke at det du forventer kommer, faktisk også er
>>det der kommer.
>
>
> Dette må du venligst gerne uddybe lidt. Hvordan skal jeg forvente hvad der
> kommer hvis det er en tilfældig bruger der indtaster noget i en form?
>


du ved altid noget om formen.

hvilke formfelter er der ?
hvad er klokken når du generere formen ?
hvad hedder din søsters kat ?
hvor lang tid er formens levetid ?

gem disse oplysninger i en tmp tabel eller fil
lav en cheksum ud af disse info, send dem med formen og valider dem mod
de gemte oplysninger.

ex:

felterne..: "navn" og "email"
Datoen....: "20-02-2003 12:42:23"
Katten....: "olga benson"
Levetid...: 10 min.

$chksum=md5( 'navn'.'email'.'20-02-2003 12:42:23'.'olga benson'.'600' )

"hidden felt" = $chksum

insert into tmp($chksum, 'navn|email', '20-02-2003 12:42:23', 'olga
benson', 600)

--

når du så får formen retur hentes dataene ud fra tabellen og hvis der
ikke er gået mere end 600 sec(10 min) så laves et check på om formens
checksum er den samme som den du har data gemt på i databasen.



--
>> ulrik - ulrik(@)lazy.dk
excuse of the day : The rolling stones concert down the road caused a
| brown out
from bofh : http://www.cs.wisc.edu/~ballard/bofh/


Martin Mouritzen (17-02-2003)
Kommentar
Fra : Martin Mouritzen


Dato : 17-02-03 17:11

On Mon, 17 Feb 2003 15:37:04 +0100, "Tommy Olsen" <spam@linuxhq.dk>
wrote:

>1) brugeren indtaster tekst som gerne må indeholde visse HTML-tags, men
>ikke alle. Således at man undgår XSS-attacks og lign.

http://www.php.net/manual/en/function.strip-tags.php

>2) Teksten bliver gemt i en database.

http://www.php.net/manual/en/function.stripslashes.php
http://www.php.net/manual/en/function.addslashes.php

>3) Den indtastede tekst fra brugeren skal vises på en HTML-side.

Kig evt. på:
http://www.php.net/manual/en/function.htmlspecialchars.php

>Hvilke midler i henholdsvis 1, 2 og 3 skal man tage i brug for at være på
>den helt sikre side, så der ikke kan laves injection- og XSS-attacks?

Nu er jeg ikke helt klar over hvad et XSS eller injection attack er
(Er det hvor man f.eks. lavet <img src="JavaScript:alert();"> ?)

Men så længe du validerer din data korrekt burde det ikke ske.

Men der findes nok væsentligt mere uddybende sites end du lige får
svar her i nyhedsgruppen.
--
BellCom Internet ApS. Martin Mouritzen Phone: +45 39401717
Gersonsvej 25 Udvikler Fax: +45 39400144
DK-2900 Hellerup mm@bellcom.dk http://www.bellcom.dk

Tommy Olsen (18-02-2003)
Kommentar
Fra : Tommy Olsen


Dato : 18-02-03 00:16

On Mon, 17 Feb 2003 17:11:26 +0100, Martin Mouritzen wrote:

>>1) brugeren indtaster tekst som gerne må indeholde visse HTML-tags, men
>>ikke alle. Således at man undgår XSS-attacks og lign.
>
> http://www.php.net/manual/en/function.strip-tags.php

Denne funktion har jeg såmænd kigget på, men jeg synes ikke rigtigt
funktionens beskrivelse giver mig et fuldgyldigt svar på det jeg ønsker.

Der står bl.a.:
"It errors on the side of caution in case of incomplete or bogus tags."

Dette vil altså sige at jeg får smidt en fejl tilbage i hovedet hvis
brugeren indtaster noget bogus, eller har jeg misforstået noget?. Men
hvad gør jeg så ud over strip_tags()? Skal jeg finde et eller andet ondt
regex frem? Skal jeg kun tillade selvopfundne tags a la: etc.?
Hvordan gør I?

Jeg ønsker ikke at stå i en situation hvor et ikke-lukket <b>-tag gør
at resten af siden bliver i fed skrift!

>>2) Teksten bliver gemt i en database.
>
> http://www.php.net/manual/en/function.stripslashes.php
> http://www.php.net/manual/en/function.addslashes.php

Disse funktioner havde jeg som sagt kigget på, det jeg efterlyser er en
lidt mere grundig uddybelse af hvordan disse skal bruges korrekt(!). En
henvisning til en artikel om sikkerheden mht. Database<->PHP ville være
helt fornuftig.

>>Hvilke midler i henholdsvis 1, 2 og 3 skal man tage i brug for at være
>>på den helt sikre side, så der ikke kan laves injection- og
>>XSS-attacks?
>
> Nu er jeg ikke helt klar over hvad et XSS eller injection attack er (Er
> det hvor man f.eks. lavet <img src="JavaScript:alert();"> ?)

Ja, for eksempel. Det jeg ønsker er en bulletproof(tm) måde hvorpå man kan
være sikker på at brugeren ikke laver disse numre.

Nu er problemet jo ikke nyt og uprøvet, så problemstillingen må være
gennemgået før og der må næsten være lavet nogle artikler der gennemgår
hvorledes man skal gribe sagen an.

> Men så længe du validerer din data korrekt burde det ikke ske.

Altså, det er jo ikke min data. Jeg kan ikke være sikker på at brugeren
har været konsistent i sin indtastning af tekst i en form. Specielt ikke
hvis det er en tilfældig bruger der kunne have andre hensigter.

Findes der ikke et gennemprøvet system/klasse i fx. PEAR eller lign. som
kan tage hånd om denne problemstilling om input validering?

--
Tommy Olsen

Jesper Brunholm (18-02-2003)
Kommentar
Fra : Jesper Brunholm


Dato : 18-02-03 02:01

Tommy Olsen wrote:
> Hej,
>
> Da jeg er igang med at lave noget PHP, har jeg samtidigt brug for at
> brugerens input fra en FORM bliver valideret ordentligt.

> Jeg har tidligere (2år) kigget på bl.a. addslashes() og stripslashes(),
> men har ikke rigtigt leget med input-validering siden, derfor ønsker jeg lidt
> input fra andre om hvordan I gør.

addslashes er basics, validering op imod en liste af forbudte ord kan
bruges til noget - brugt med omtanke

Alt det der kun kan være tal i kan chekkes med is_numeric()

strip_tags() er nævnt fra anden side - bemærk at du kan legalisere
enkelte tags, så den er stærk. Endnu stærkere er dog efter min mening at
lave tags selv, som du erstatter med rigtige efter at have kørt
strip_tags uden nogen undtagelser. I stil med:

|b| erstattes med <b> osv. (men kun den - dvs |b javascript:xxx/style|
ryger ikke igennem, så vidt jeg husker i modsætning til strip_tags -
løsningen.

Du kan finde mere om emnet tilbage i gruppen - søg med groups.google.com

Venligst

Jesper Brunholm



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

Månedens bedste
Årets bedste
Sidste års bedste