Pertanyaan Apa tujuan dari is_uploaded_file ()?


Dokumen mengatakan:

Mengembalikan TRUE jika file yang dinamai oleh nama file diunggah melalui HTTP POST

Bagaimana bisa $_FILES['blah']['tmp_name'] mungkin bukan hasil upload POST? PHP membuat nama file ini.

Ini berguna untuk membantu memastikan bahwa pengguna jahat belum mencoba   tipuan skrip untuk mengerjakan file yang seharusnya tidak ada   bekerja - misalnya, / etc / passwd.

Saya mengerti bahwa saya harus hati-hati memeriksa isi dan ukuran file. Tapi bagaimana bisa seorang penyerang mengontrol apa pun temp nama file dari file yang diunggah?

Atau tidak is_uploaded_file() melakukan pemeriksaan lain?

Terima kasih telah memberi cahaya.


18
2017-11-24 19:50


asal


Jawaban:


Yah, kamu bisa lulus apa saja string ke is_uploaded_file.

Tentu, jika Anda melewatkannya langsung $_FILES maka ya tentu saja itu akan selalu kembali true, tetapi jika Anda membentuk argumen sendiri maka itu tidak mungkin.


10
2017-11-24 20:11



Dalam bentuknya saat ini, is_uploaded_file memeriksa bahwa unggahan file diaktifkan (jika tidak, itu tidak mungkin menjadi file yang diunggah) dan bahwa nama file yang disediakan sebenarnya telah dihasilkan oleh PHP (saya tahu ini dari melihat sumber).

Ini tidak benar-benar membantu, karena jika tidak ada masalah selama pengunggahan itu

is_uploaded_file($_FILES['blah']['tmp_name'])

akan selalu kembali true.

Namun, pertimbangkan itu $_FILES telah "hanya" tersedia sejak PHP 4.1.0, sementara is_uploaded_file pertama muncul dengan PHP 4.0.3. Kesimpulan yang tampaknya logis di sini adalah itu agak sulit untuk mendapatkan penanganan file yang diunggah bekerja dengan aman sebelum $_FILES superglobal dibuat tersedia. Jika tidak ada yang lain, non-superglobals dapat disuntikkan ke dalamnya, dan sangat mudah begitu dengan register_globals diaktifkan - yang digunakan menjadi titik sakit lain dengan keamanan PHP.

Jika ada yang menulis kode hari ini dan menggunakan $_FILES seperti yang seharusnya, lalu saya katakan is_uploaded_file dalam penerapannya saat ini "tidak berguna" karena tidak ada vektor serangan yang dapat menipu Anda untuk memproses file "buruk".

Namun, ada juga cara lain untuk melihat sesuatu: is_uploaded_file dijamin akan berfungsi dengan benar sekarang dan di masa depan, selama tersedia, terlepas dari apa mekanisme mengunggah file dan membuatnya tersedia bagi programmer. Mungkin sekarang juga ia tidak menyediakan sesuatu yang konkrit, tetapi ini merupakan abstraksi atas konsep "upload file aman" yang datang dengan jaminan. Saya akan berpikir bahwa tidak ada jaminan untuk itu $_FILES (Sekali lagi, meskipun saya menganggapnya sebagai regresi jika status quo saat ini berubah "menjadi lebih buruk").


25
2017-11-24 20:10



bool is_uploaded_file ( string $filename )

Mengembalikan TRUE jika file yang dinamai oleh nama file diunggah melalui HTTP POST. Ini berguna untuk membantu memastikan bahwa pengguna jahat belum mencoba mengelabui skrip untuk bekerja pada file yang seharusnya tidak berfungsi - misalnya, / etc / passwd.

Pemeriksaan semacam ini sangat penting jika ada kemungkinan bahwa apa pun yang dilakukan dengan file yang diunggah dapat mengungkapkan isinya kepada pengguna, atau bahkan ke pengguna lain di sistem yang sama.

Untuk bekerja dengan baik, fungsi is_uploaded_file () membutuhkan argumen seperti

 $_FILES['userfile']['tmp_name'],

- nama file yang diunggah di mesin klien

$_FILES['userfile']['name'] 

tidak bekerja.

sumber: manual php


1
2018-03-07 06:24