| 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. |
|
|
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). 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 |
|
|
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. 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 |
|
|
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. 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: @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 :) |
|
|
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 Primer strani z večimi vstopnimi točkami: /vstopna.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. 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 |
||
|
blackmamba
7. feb 2013 22:34:27
Pridružen od: 4. mar 2008 559 objav 392 25 11 |
||