Nalaganje datotek s pomočjo PHP-ja
 
powerzan 7. feb 2013 10:15:33 Pridružen od:
20. feb 2012
113 objav
77 19 2
#1

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.


všeč(0) ni všeč(0) spam(0)
 
SlimDeluxe 7. feb 2013 10:26:49 Pridružen od:
29. apr 2010
1223 objav
1022 144 9
#2

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 :)


všeč(1) ni všeč(0) spam(0)
Freelance Web Developer
 
Mešetar 7. feb 2013 10:37:35 Pridružen od:
24. nov 2010
1543 objav
1945 962 114
#3

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


všeč(1) ni všeč(0) spam(0)
 
technolog 7. feb 2013 12:41:08 Pridružen od:
14. nov 2011
598 objav
768 300 22
#4

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.


všeč(2) ni všeč(0) spam(0)
Z linuxom že 7 let. Pro web development.
 
Mešetar 7. feb 2013 13:00:04 Pridružen od:
24. nov 2010
1543 objav
1945 962 114
#5

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


všeč(2) ni všeč(0) spam(0)
 
technolog 7. feb 2013 13:05:21 Pridružen od:
14. nov 2011
598 objav
768 300 22
#6

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.


všeč(1) ni všeč(0) spam(0)
Z linuxom že 7 let. Pro web development.
 
powerzan 7. feb 2013 13:28:44 Pridružen od:
20. feb 2012
113 objav
77 19 2
#7

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 :)


všeč(0) ni všeč(0) spam(0)
 
technolog 7. feb 2013 13:52:59 Pridružen od:
14. nov 2011
598 objav
768 300 22
#8

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.


všeč(1) ni všeč(0) spam(0)
Z linuxom že 7 let. Pro web development.
 
powerzan 7. feb 2013 13:57:17 Pridružen od:
20. feb 2012
113 objav
77 19 2
#9

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


všeč(0) ni všeč(0) spam(0)
 
blackmamba 7. feb 2013 22:34:27 Pridružen od:
4. mar 2008
559 objav
392 25 11
#10

Kaj pa server side preverjanje mime typa?

http://php.net/manual/en/function.finfo-open.php


všeč(0) ni všeč(0) spam(0)
 
 

🔒 Za odgovor na to temo se moraš prijaviti.

Prijavi se