Autor Zpráva
webguru
Profil
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
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
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
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
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
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
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
Alphard:
na riadku 17. Aspoň mne nenahralo nič, len tie povolené formáty.
Alphard
Profil
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
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
Keeehi:
máte pravdu, zmenil som koncovku zo page.php na page.jpg a nahralo to :)
Keeehi
Profil
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.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0