1. Unggah file
Agar pengguna klien mengunggah file, kami harus menyediakan formulir di antarmuka pengguna untuk mengirimkan permintaan untuk mengunggah file. Karena file yang diunggah adalah data khusus, tidak seperti data posting lainnya, kita harus mengatur penyandian khusus untuk formulir:
Salin kode sebagai berikut: <Form Action = "unggah
Anda mungkin tidak terbiasa dengan atribut enctype di atas, karena ini sering diabaikan. Namun, jika permintaan HTTP Post berisi data reguler dan data seperti file, atribut ini harus ditambahkan, yang dapat meningkatkan kompatibilitas untuk berbagai browser.
Selanjutnya, kita harus menambahkan bidang ke formulir untuk mengunggah file:
Salin kode sebagai berikut: <input type = "file" name = "lampiran">
Bidang file di atas dapat berperilaku berbeda di berbagai browser. Untuk sebagian besar browser, bidang di atas diterjemahkan ke dalam kotak teks dengan tombol penelusuran. Dengan cara ini, pengguna dapat memasukkan jalur file ke dalam kotak teks sendiri, atau memilih file yang akan diunggah dari hard disk lokal melalui tombol penelusuran. Namun, di Safari Apple, tampaknya hanya penelusuran yang dapat digunakan. Tentu saja, Anda juga dapat menyesuaikan gaya kotak unggahan ini agar terlihat lebih elegan daripada gaya default.
Di bawah ini, untuk menjelaskan cara menangani unggahan file dengan lebih baik, berikan contoh lengkap. Misalnya, formulir berikut memungkinkan pengguna untuk mengunggah lampiran ke server lokal saya:
Salin kode sebagai berikut: <p> Harap unggah lampiran Anda: </p>
<Form Action = "unggah
<input type = "file" name = "lampiran">
<input type = "kirim" value = "unggah lampiran">
</form>
Tip: Anda dapat mengatur nilai maksimum yang memungkinkan pengunggahan file melalui unggah_max_filesize di php.ini. Selain itu, ada juga post_max_size yang dapat digunakan untuk mengatur data formulir maksimum yang diizinkan untuk diunggah. dengan mengatur bidang ini. Namun, perhatikan bahwa nilai yang terakhir harus lebih besar dari yang sebelumnya, karena yang pertama adalah bagian dari sebagian data bentuk yang terakhir.
Gambar 1. Formulir Unggah Ditunjukkan di Firefox
Ketika formulir ini dikirimkan, permintaan HTTP akan dikirim ke unggahan.php. Untuk menunjukkan informasi spesifik apa yang dapat digunakan di unggah.php, saya mencetaknya di unggah.php:
Salinan kode adalah sebagai berikut:
header ('tipe konten: teks/polos');
print_r ($ _ file);
Mari kita lakukan percobaan.
Salin kode sebagai berikut: Array
(
[lampiran] => array
(
[name] => boy.jpg
[type] => gambar/jpeg
[tmp_name] => d: /xampp/tmp/php1168.tmp
[error] => 0
[ukuran] => 11490
)
)
Di atas adalah semua informasi tentang file yang saat ini diunggah dalam array global setelah file diunggah. Namun, dapatkah kita memastikan bahwa informasi ini aman, bagaimana jika nama atau informasi lain telah dirusak? Kami selalu perlu waspada tentang informasi dari klien!
Setiap bagian dari permintaan HTTP tertentu
Untuk lebih memahami unggahan file, kita harus memeriksa informasi spesifik apa yang terkandung dalam permintaan HTTP yang dikirim oleh klien. Lampiran yang saya unggah sebelumnya adalah logo blog ini, karena itu adalah gambar, tidak cocok bagi kita untuk melakukan eksperimen di atas. Jadi, saya mengunggah file teks test.text lagi, yang berisi konten berikut:
Salinan kode adalah sebagai berikut:
360w
360 hari
Life of a Web Boy
Oke. Sekarang saya mengunggah file teks ini dan mengeluarkannya di unggah.php:
Salinan kode adalah sebagai berikut:
Array
(
[lampiran] => array
(
[name] => test.txt
[type] => teks/polos
[tmp_name] => d: /xampp/tmp/php51c0.tmp
[error] => 0
[ukuran] => 40
)
)
Mari kita lihat permintaan HTTP Post yang dikirim oleh browser yang relevan (saya menghilangkan beberapa header opsional):
Salinan kode adalah sebagai berikut:
Post /upload.php http /1.1
Tuan rumah: www.360weboy.me
Referensi: http://www.360weboy.me/
multipart/form-data; -------------------------------------------------- -------------------------
Panjang konten: 234
--------------------------------------- 24464570528145
Disposisi Konten: Formulir-Data;
Jenis konten: Teks/polos
360Weboy
360 hari
Life of a Web Boy
------------------------------------ 24464570528145-
Ada beberapa bidang dalam format permintaan, nama, nama file, dan tipe konten di atas test.txt, dan teks format file yang diunggah/polos (mewakili file teks). Kemudian, kami melihat bahwa baris berikut adalah konten spesifik dalam file yang diunggah.
2. Memperkuat keamanan
Untuk meningkatkan keamanan dalam mengunggah file, kita perlu memeriksa tmp_name dan ukuran di array global $ _files. Untuk memastikan bahwa file yang ditunjuk oleh tmp_name memang file yang diunggah oleh pengguna pada klien, daripada menunjuk ke sesuatu seperti /etc /passwd, Anda dapat menggunakan fungsi is_uploaded_file () dalam php untuk membuat penilaian berikut :
Salinan kode adalah sebagai berikut:
$ filename = $ _files ['lampiran'] ['tmp_name'];
if (is_uploaded_file ($ filename)) {
/ * adalah file yang diunggah.
}
Dalam beberapa kasus, setelah pengguna mengunggah file, konten file yang berhasil diunggah dapat ditampilkan kepada pengguna untuk dilihat, sehingga pemeriksaan kode di atas sangat penting.
Hal lain yang perlu diperiksa adalah tipe MIME dari file unggahan, yang merupakan bidang jenis array output di unggahan.php di atas. Apa yang saya unggah dalam contoh pertama adalah gambar, jadi nilai $ _files ['lampiran'] ['type'] adalah 'gambar/jpeg'. Jika Anda berencana untuk hanya menerima gambar tipe-mime seperti gambar/png, gambar/jpeg, gambar/gif, gambar/x-png dan gambar/p-jpeg di sisi server, Anda dapat menggunakan kode yang mirip dengan berikut untuk memeriksa (Cukup lihat itu) Contoh, kode spesifik, seperti kesalahan, harus mengikuti mekanisme dalam sistem Anda):
Salinan kode adalah sebagai berikut:
$ allow_mimes = array (
'gambar/png',
'gambar/x-png',
'gambar/gif',
'Image/JPEG',
'Image/pjpeg'
);
$ image = $ _files ['lampiran'];
if (! in_array ($ image ['type'], $ allow_mimes)) {
Die ('Maaf, format file yang Anda unggah tidak akurat; kami hanya menerima file gambar.');
}
// Lanjutkan memproses file gambar yang diunggah
Seperti yang Anda lihat, kami telah memastikan bahwa tipe-mime dari file tersebut memenuhi persyaratan sisi server. Namun, itu tidak cukup untuk mencegah pengguna jahat mengunggah file berbahaya lainnya, karena pengguna jahat dapat berpura-pura disamarkan oleh tipe-mime ini. Misalnya, pengguna membuat gambar JPG, menulis beberapa kode PHP berbahaya ke dalam metadata gambar, dan menyimpannya sebagai file dengan akhiran bernama PHP. Ketika file berbahaya ini diunggah, itu akan berhasil diperiksa oleh sisi server untuk tipe MIME, yang dianggap sebagai gambar, dan kode PHP berbahaya di dalamnya akan dieksekusi. Metadata gambar spesifik mirip dengan yang berikut:
Salinan kode adalah sebagai berikut:
Nama File: Image.jpg
Ukuran file: 182007 byte
Tanggal File: 2012: 11: 27 7:45:10
Resolusi: 1197 x 478
Komentar: Passthru ($ _ POST ['CMD']);
Kita dapat melihat bahwa kode PHP ditambahkan ke bidang komentar metadata gambar. Jadi, jelas bahwa untuk mencegah situasi berbahaya yang serupa, pemeriksaan yang diperlukan dari perpanjangan file yang diunggah juga harus dilakukan. Kode berikut meningkatkan kode sebelumnya untuk memeriksa tipe mime:
Salinan kode adalah sebagai berikut:
$ allow_mimes = array (
'Image/png' => '.png',
'Image/x-png' => '.png',
'Image/gif' => '.gif',
'Image/jpeg' => '.jpg',
'Image/pjpeg' => '.jpg'
);
$ image = $ _files ['lampiran'];
if (! array_key_exists ($ image ['type'], $ allow_mimes)) {
Die ('Maaf, format file yang Anda unggah tidak akurat; kami hanya menerima file gambar.');
}
// Dapatkan nama file dengan nama akhiran yang dihilangkan:
$ filename = substr ($ image ['name'], 0, strpos ($ image ['name'], '.'));
// Tambahkan nama akhiran
$ filename. = $ allow_mimes [$ image ['type']];
// Lanjutkan memproses file yang diunggah
Melalui kode di atas, kami memastikan bahwa bahkan jika Metafile gambar yang diunggah berisi kode PHP, file gambar akan diubah namanya sebagai file dengan nama akhiran dan format gambar, sehingga kode PHP di dalamnya tidak akan dieksekusi. Kode di atas tidak akan memiliki dampak negatif pada gambar yang diunggah normal.
Setelah melakukan beberapa langkah di atas untuk meningkatkan pemeriksaan keamanan, jika Anda hanya ingin menyimpan file yang diunggah ke direktori yang ditentukan, Anda dapat menggunakan fungsi default MOVE_Uploaded_File dari PHP untuk mengimplementasikannya:
Salinan kode adalah sebagai berikut:
$ tmp_filename = $ _files ['lampiran'] ['tmp_name'];
$ filename = '/path/to/attachment.txt';
if (move_uploaded_file (tmp_filename, $ filename)) {
/ * $ temp_filename file unggah yang disimpan di direktori sementara, dan kemudian berhasil menyimpannya ke file attachment.txt di direktori yang sesuai.
}
Anda mungkin juga harus membatasi ukuran file yang diunggah, sehingga Anda dapat menggunakan fungsi filose untuk mendapatkan ukuran file yang diunggah, membuat penilaian dan melakukan pemrosesan lebih lanjut.
Oke, mari kita tulis ini untuk saat ini tentang unggahan file. Semoga artikel pengantar ini akan membantu Anda.