Nalaganje datotek s pomočjo PHP-ja

Zanima me, kako približno izgleda varna skripta za nalaganje datotek s pomočjo PHP-ja. Trenutno imam to urejeno takole:

moveuploadedfile($_FILES['fil']['tmp_name'], "../projekti/datoteke/$uploadFilename");

pri čemer pri spremenljivki $uploadFilename določim ime in končnico, ki jo datoteka ima. Pri nalaganju slik pa seveda prej tudi preverim, če je format pravilen (png, jpg,...).

Prosim za vse nasvete in predloge, kaj bi lahko popravil.

11 odgovorov

Lahko daš noter še en .htaccess s katerim preprečiš morebitni direktni dostop do datotek (če nekomu npr. uspe injectati php file v tvoj upload dir).
Najbolje da sestaviš whitelist (seznam končnic, ki so po tvoje veljavni uploadi).
Pogooglaj za primer, moram it stran zdaj :)

1

tle imas listo, kaj moras postimat...

ko preveris koncnico, kar je res osnova, bi bilo fajn, da preveris se mime type datoteke... ker nekdo lahko komot zamaskria exec datoteko kot sliko s koncnico jpg recimo... pol pa spremeni nazaj ali karkoli...

dober predlog je tudi, da sliko ko je nalozena se enkrat sprocesiras (GD ali imagick) da sigurno dobis image ven)

pa kot je slim povedal.. obvezno dobroz ascriti upload dir.... recimo tudi tako, da nobena datoteka notri ni executable

1

Tukaj je glavni problem ta, da so serverji ponavadi tako skonfigurirani, da poganjajo vse, kar se konča s .php. Tako da če ti nekdo uspe naložit nekaj s .php končnico, se bo to izvedlo, če le zahtevaš pravo pot.

V bistvu je najbolj varno, da določiš točno katere so tvoje datoteke (whitelist), ki se lahko poženejo. Če imaš spletno napisano tako, da ima eno vstopno točko, narediš torej tako, da PHP engine poganja samo /index.php

@Mešetar: skriptna datoteka s končnico .jpg ni nevarna, oz. odvisno koliko si paranoičen. Poganjanje vsake naložene datoteke skozi GD je potratno, na kakem shared hostingu je to skoraj gotov recept za banane.

2

ja itaq... vsak extra security je potraten... pac moznost imas, ce si paranoicen jo bos ekstra izkoristil, ce pa ne, pac ne

2

Pozabljaš, da je neka datoteka lahko hkrati veljavna .JPG slika in hkrati veljavna .PHP skripta. Poganjanje skozi GD ne pomaga nič. Sicer veš, da je slika, vendar je lahko zraven še zelo nevarna php skripta.

Edina kolikor toliko zanesljiva rešitev je, da omejiš katere datoteke gredo lahko čez PHP engine in katere se podajo brskalniku direktno, brez izvajanja.

Je pa treba bit pazljiv na XSS napad, več pa v odgovoru k vprašaju na StackOverflow, ki si ga linkal.

1

Sepravi, kolikor sem vse razumel, moram:
- onemogočiti dostop do datotek s .htaccess (ali to pomeni, da ne uporabnik ne bo moral prenesti kakšno EXE datoteko)
- onemogočiti nalaganje PHP in podobnih datotek, ki bi lahko same izvajale svojo kodo

@technolog: Nisem zastopil kaj misliš z "Če imaš spletno napisano tako, da ima eno vstopno točko, narediš torej tako, da PHP engine poganja samo /index.php"? Si mislil tako, da ima spletna stran samo eno datoteko (index.php), oz. jih je več?

Sicer pa vsem najlepša hvala za vse (prijazne) odgovore :)

Primer strani z eno vstopno točko:

/index.php?stran=vstopna
/index.php?stran=izdelki
/index.php?stran=kontakt

Primer strani z večimi vstopnimi točkami:

/vstopna.php
/izdelki.php
/kontakt.php

Kot vidiš, pri strani z eno vstopno točko se vedno požene samo ena php datoteka (spletna stran jih lahko vsebuje več - preko include() ) - to je index.php. Torej lahko omejiš, da je to edina datoteka, ki se sploh lahko požene. Če narediš to, nimaš skoraj nobene več skrbi.

1

Aha, vredu, jaz imam več vstopnih točk. Najlepša hvala za razlago :)

Kaj pa server side preverjanje mime typa?
http://php.net/manual/en/function.finfo-open.php

In kaj ti to pomaga?