ugrás a tartalomhoz

PHP - move_uploaded_file mennyire fontos

inf · 2012. Jún. 8. (P), 20.22
Üdv.

Van egy olyan kínom a php-val, hogy a fájlnevek helyett szeretnék File objecteket használni, és a move_uploaded_file nagyon bekever ebbe. A kérdésem az, hogy van e bármilyen veszélye annak, hogyha sima move-al mozgatom a feltöltött fájlt?

(A $_FILES-ban előzőleg ellenőrzöm, hogy nincs e feltöltési hiba...)
 
1

Egyelőre ilyen a kód, ami

inf · 2012. Jún. 8. (P), 20.45
Egyelőre ilyen a kód, ami átalakítja.

class Clean_Communication_Message_Transformation_Upload_File implements Clean_Transformation_TransformerInterface {

    protected $acceptedMimeTypes;

    public function __construct(array $acceptedMimeTypes) {
        $this->acceptedMimeTypes = $acceptedMimeTypes;
    }

    public function transform($subject) {
        if (!is_array($subject))
            throw new InvalidArgumentException('Upload subject must be array.');
        if ($subject['error'] != UPLOAD_ERR_OK || !is_uploaded_file(realpath($subject['tmp_name'])))
            throw new Exception('Upload error occured: ' . var_export($subject, true));
        if (!in_array($subject['type'], $this->acceptedMimeTypes))
            throw new InvalidArgumentException('Subject mime type: ' . $subject['type'] . ' is not allowed: ' . Clean_String::concat($this->acceptedMimeTypes, ', '));
        return new Clean_FileSystem_File($subject['tmp_name']);
    }

}
Ha van bármi észrevételetek, vagy tudtok biztonsági résről ezzel kapcsolatban, akkor szóljatok.
2

Sima move?

T.G · 2012. Jún. 8. (P), 21.34
Mit jelent, hogy sima move?
A move_uploaded_file és a rename más jogosultsággal dolgozik, tehát megfelelő php beállításokkal a rename nem olvashatja azt a fájlt, amit a move_uploaded_file igen!
3

Ja a rename-re gondoltam

inf · 2012. Jún. 8. (P), 21.47
Ja a rename-re gondoltam :-)
Köszi, akkor majd odafigyelek a beállításokra...
4

Nem

janoszen · 2012. Jún. 9. (Szo), 18.41
This function checks to ensure that the file designated by filename is a valid upload file (meaning that it was uploaded via PHP's HTTP POST upload mechanism). If the file is valid, it will be moved to the filename given by destination.


Ergó van benne egy biztonsági mechanizmus a piszkálás elkerülése érdekében. Azt javaslom, hogy ne próbáld meg mással helyettesíteni.
5

Elméletileg az

inf · 2012. Jún. 9. (Szo), 19.51
Elméletileg az is_uploaded_file + rename ez a függvény. Egyébként most nézem, hogy nem is muszáj helyettesíteni, elég egy if (is_uploaded_file) move_uploaded_file(...) else rename(...). Majd még meglátom, nehéz beinjektálni azt, hogy valaminek feltöltött fájlnak kell e lennie vagy sem.

bool is_uploaded_file ( string $filename )

Returns TRUE if the file named by filename was uploaded via HTTP POST. This is useful to help ensure that a malicious user hasn't tried to trick the script into working on files upon which it should not be working--for instance, /etc/passwd.

This sort of check is especially important if there is any chance that anything done with uploaded files could reveal their contents to the user, or even to other users on the same system.


Na most szerintem ennek az egésznek semmi értelme nincs, mármint a feltöltött fájlok sosem kerülnek olyan helyre, ahol veszélyt jelenthetnének. Van egy mappa, ahova csak feltöltött fájlok mennek, onnan több script helyezi át őket a public (wwwroot) mappa különböző részeire, a php fájlokkal meg nem keveredhetnek, plusz kiterjesztésre meg mime type-ra ellenőrzöm őket.

Tudtok olyan támadási módról, amit ez a move_uploaded_file megakadályoz?
6

Nem

janoszen · 2012. Jún. 9. (Szo), 22.43
Nem, de nem tudhatod, nem raknak-e bele később. Tekintve, hogy Te a PHP implementációjára hagyatkozol a feltöltött file-ok HTTP-ből való parzolására, nem érdemes a PHP által ajánlott megoldást mellőzve sajátot írni. Ha saját HTTP implementációd lenne, még megérteném, de így...

A másik hiba, amit elkövetsz pedig az, hogy így viszont a szoftvered csak akkor lesz biztonságos és jól üzemeltethető, ha csak olyan szerveren fut, aminek te mondod meg a konfigurációs paramétereit.
7

Aha, értem.

inf · 2012. Jún. 9. (Szo), 23.02
Aha, értem.

Bettem egy check-et, hogyha is_uploaded_file van, akkor move_uploaded_file-al helyezze át, ellenkező esetben meg rename-el... Felesleges injektálni, hogy feltöltöttnek kell e lennie, mert azt meg külön ellenőrzöm, amikor kiolvasom a $_FILES-ból, és létrehozom az objektumokat. Kösz a segítséget.
8

Értelme?

janoszen · 2012. Jún. 10. (V), 14.27
Ennek így mi értelme? Ha is_uploaded_file-al leellenőrzöd, akkor mozgasd át, egyébként meg 400 Bad Request.
9

Mint az előbb mondták a

inf · 2012. Jún. 10. (V), 14.54
Mint az előbb mondták a jogosultság is más lehet, úgyhogy biztos ami biztos :-)