Autor | Zpráva | ||
---|---|---|---|
webguru Profil |
#1 · Zasláno: 25. 4. 2015, 20:15:19
Mám hotový a funkčný kód pre nahrávanie. Aké máte odporučenie o vylepšenie, čo sa týka bezpečnosti a samotného skriptu. Ďakujem
<?php if(isset($_POST['ok'])) { if(empty($soubor)) { echo "<div class='error'>Veď ste si nič nevybrali...</div>"; } $timess = mt_rand(0, 100000); if ($ok == "Upload" && $soubor_name!="") { $stext = str_replace(" ", "A", $soubor_name); $str = strtr($stext, 'áäčďéěëíµňôóöŕřšťúůüýžÁÄČĎÉĚËÍĄŇÓÖÔŘŔŠŤÚŮÜÝŽ', 'aacdeeeilnooorrstuuuyzaacdeeelinooorrstuuuyz'); $sname = $timess.$str; $size = $soubor_size / 1000; if ($soubor_type == "image/jpeg" OR $soubor_type == "image/jpg" OR $soubor_type == "image/gif" OR $soubor_type == "image/png") { if (move_uploaded_file ($soubor, "images/$sname")) { echo "<div class='success'>Subor $sname o velkosti $size KB bol nahraný na server.</div> link:<BR> <div class='notice'>http://xxxx/images/$sname/</div> "; } else { echo "<div class='error'>Súbor sa nepodarilo nahrať, došlo k chybe!</div>"; } } else { echo "<div class='error'>Zadali ste špatný typ súboru!</div><BR>"; } } } ?> <FORM ACTION="xxxx" METHOD="post" ENCTYPE="multipart/form-data"> <INPUT TYPE="file" NAME="soubor" SIZE="40"> <INPUT TYPE="submit" NAME="ok" VALUE="Upload"> </FORM> |
||
lionel messi Profil |
#2 · Zasláno: 25. 4. 2015, 20:24:19
webguru:
Pridám len zopár triviálnejších amatérskych postrehov, určite nevystihnem všetky slabiny, nie som žiadny expert. 1. Riadok 6 ( $soubor ) evidentne spolieha na register_globals , čo je bezpečnostné fuj najhrubšieho zrna (a od PHP 5.4 ide tuším o úplne odstránenú direktívu).
2. Na r. 13 sa usiluješ o odstránenie diakritiky, nie je to však veľmi dôsledné. Napríklad ignoruješ bežne používané písmená slovenskej abecedy ( ľ , ĺ ).
3. Kde definuješ premennú $soubor_name ? A čo $ok (súvisí s bodom 1)?
|
||
webguru Profil |
#3 · Zasláno: 25. 4. 2015, 20:34:59
lionel messi:
odpoved na: 1, všade na webw som videl používať túto možnosť, sú to síce starí stránky, to je pravda. Ako sa to dá nahradiť? 2, doplním 3, ok je nazov inputu a premenna $soubor_name je nazov súboru.
Ďakujem za reakciu |
||
lionel messi Profil |
#4 · Zasláno: 25. 4. 2015, 20:42:30
webguru:
„1, všade na webw som videl používať túto možnosť, sú to síce starí stránky,“ Bohužiaľ, na webe sa povaľuje značné množstvo kódu slabšej kvality (čiastočne to platí aj pre niektoré staré papierové učebnice). „Ako sa to dá nahradiť?“ Jednoducho (sám by som to lepšie nenapísal). „3, ok je nazov inputu a premenna $soubor_name je nazov súboru.“
Miesto $ok použi $_POST['ok'] a názov súboru by si mal hľadať v $_FILES['soubor']['name'] . Taktiež odporúčam na prečítanie dokumentáciu: php.net/manual/en/features.file-upload.post-method.php (v angličtine).
|
||
Keeehi Profil |
#5 · Zasláno: 25. 4. 2015, 20:52:23
Bezpečnostní díra tam je. Nikde nekontroluješ název souboru což je velmi důležité. Lze vytvořit soubor, který bude validním obrázkem, tudíž projde přes tu kontrolu na řádku 17, a přesto v něm bude validní php script. Takže když se bude jmenovat obrázek.php, script se v něm spustí.
|
||
webguru Profil |
#6 · Zasláno: 25. 4. 2015, 21:23:36
lionel messi:
1,vsimol som si :). Ok diki Keeehi: Ale ved tam sa kontrouje koncovka suboru a nemyslim si ze by to nahralo obrazo.php |
||
Alphard Profil |
#7 · Zasláno: 25. 4. 2015, 21:35:41
webguru:
„Ale ved tam sa kontrouje koncovka suboru“ Na kterém řádku? Zdá se mi, že se do cílové cesty "images/$sname" přes různé nahrazování dostane původní extenze z $soubor_name .
|
||
webguru Profil |
#8 · Zasláno: 25. 4. 2015, 22:25:24
Alphard:
na riadku 17. Aspoň mne nenahralo nič, len tie povolené formáty. |
||
Alphard Profil |
#9 · Zasláno: 25. 4. 2015, 22:38:58
webguru [#8]:
To nestačí, měl byste explicitně kontrolovat přípony ukládaných souborů. Takto umožňujete upload souboru s příponou, díky které bude soubor vyhodnocen php interpretem (i s případným záškodnickým kódem). Alternativou je zakázat vyhodnocování scriptů v daném adresáři, Apache to podporuje např. pomocí .htaccess. |
||
webguru Profil |
#10 · Zasláno: 25. 4. 2015, 22:43:09
Alphard:
ok. diki |
||
Keeehi Profil |
webguru:
„Ale ved tam sa kontrouje koncovka suboru a nemyslim si ze by to nahralo obrazo.php“ Tak sem napiš adresu, kde je ten script a já ti dokážu, že se mýlíš. Ona totiž hodnota v $_FILE["soubor"]["type"] není vůbec věrohodná. On ji totiž posílá prohlížeč, takže je podvrhnutelná. Takže soubor ani nemusí být validní obrázek. A i kdyby se na straně serveru kontrolovalo, zda se jedná o validní obrázek, stejně v něm může být nebezpečný php kód. Je tedy nutné zajistit, aby se nahrané soubory neinterpretovali jako php kód. To se dá zajistit tak, že správně ošetříš aby soubor měl jen určitou koncovku a nebo pro složku do které se uploaduje zakážeš interpretaci všech souborů. |
||
webguru Profil |
#12 · Zasláno: 25. 4. 2015, 23:26:51
Keeehi:
máte pravdu, zmenil som koncovku zo page.php na page.jpg a nahralo to :) |
||
Keeehi Profil |
#13 · Zasláno: 25. 4. 2015, 23:35:19
Tohle ještě nebezpečné není. Problém je, že se to dá udělat tak aby se soubor stále jmenoval page.php a přesto se to povedlo nahrát.
|
||
Časová prodleva: 8 let
|
0