lifelong learner — urip iku urup, currently working on accenture.

Upload dan filter file dengan multer nodejs

1
Degananda.com -

Filter file upload

Untuk dapat menfilter jenis atau tipe dari file yang diupload dengan menggunakan multer kita akan menggunakan “fileFilter”. Penggunaan file Filter ini saat kita memanggil package multer. Perhatikan kode dibawah ini adalah contoh penggunaan filter type pada multer. Contoh dibawah ini adalah filter file hanya menerima tipe “png” selain dari extension tersebut maka akan diskip a.k.a file tidak diproses/tidak akan diupload.

var express = require('express');
var multer = require('multer');
var path = require('path');
var upload = multer(
    { 
        dest : 'uploads/',
        fileFilter : function(req, file , inst){

            var extFile = path.extname(file.originalname);
            if(extFile !== ".png"){
                // skip uploadnya
                inst(null, false)
            } else {
                inst(null, true)
            }
        }
    }
);
var app = express();
var cors = require('cors');
var sharp = require('sharp');
/* Cross Origin */
app.use(cors());
app.post('/fileupload', upload.single('photo'), function(req,res){
    if(req.file){
        sharp('./'+req.file.path).toBuffer().then(
            (data) => {
                sharp(data).resize(150).toFile('./'+req.file.path, (err,info) => {
                    res.send("oke");
                });
            }
        ).catch(
            (err) => {
                res.send('something wrong');
            }
        )
    } else {
        console.log('kamu upload apa hayoo');
        res.send('kamu upload apa gan? file apa hayoo');
    }
});

fileFilter adalah parameter yang dapat kita tambahkan saat memanggil multer. fileFilter memiliki isi sebuah fungsi yang terdapat tiga buah callback didalamnya

  1. request  (detail dari http request yang dikirimkan ke server)
  2. file , detail dari file yang sedang diproses untuk diupload
  3. kami menyebutnya sebagai action. Lihat gambar dibawah untuk lebih jelasnya.

    Pada intinnya callback ini dapat “meraise error” membuat event error dan dapat menentukan apakah file tersebut (yang sedang akan diupload) diproses atau tidak. Jika true maka akan diproses ke tahap upload jika false maka file akan diskip (tidak diupload) dan tidak akan masuk pada fungsi upload().

untuk menghandle upload maka ada tambahan kode untuk mengencek apakah ada file yang diproses atau tidak dengan menggunakan if(req.file) jika tidak ada req.file yang diproses berarti file tersebut gagal memenuhi kriteria(file extension tidak di izinkan).

Mime type

Sebenarnya ini adalah hal yang sangat riskan atau memiliki resiko yang sangat tinggi. Karena pengecekan tipe ini adalah proses yang sangat krusial kita harus berhati-hati mengingat ini adalah salah satu celah dimana cracker/hacker untuk melakukan penetrasi terhadap sistem kita. Menurut kami pribadi kode diatas tidaklah secure karena pengecekan hanya pada “FILE EXTENSION’. Seharusnya melakukan filter jenis file juga dilakukan dengan pengecekan mime tipe.

Untuk melakukan pengencekan mime tipe dapat menggunakan kode dibawah ini

fileFilter : function(req, file , inst){
    var extFile = path.extname(file.originalname);
    // mime type test
    var filetypeallowed = /png/;
    var mimetype = filetypeallowed.test(file.mimetype); // return boolean
    // cek jika extension bukan png atau mimetype tidak sama dengan png
    if(extFile !== ".png" || !mimetype){
        // skip uploadnya
        inst(null, false)
    } else {
        inst(null, true)
    }
}

Dengan kode seperti diatas kemungkinan besar celah yang biasa digunakan para cracker/hacker telah kita tutup. Namun tidak menutup kemungkinan terdapat celah lain dikemudian hari. Oleh karena itu kita harus selalu up to date mengenai kegiatan hacking dan cracking sehingga kita dapat mengamankan sistem yang telah dibuat.

Sehingga sangat kami sarankan untuk melakukan filter double. Pertama pada extension dengan menggunakan property “fileFilter” pada instances multer dan kedua adalah pengecekan mime type.

Demo

Contoh kita memiliki file “water.jpg”

ketika kita mencoba upload file tersebut maka pada console akan nampak seperti berikut ini

done semoga artikel ini dapat membantu anda yang sedang melakukan coding upload gambar. Untuk ulasan selanjutnya mengenai multer dan sharp adalah mengenai compressing. Fitur yang sangat penting yang harus ada. Tanpa kompressi file akan menjadi sangat besar menyebabkan banyak kerugian seperti

  1. Biaya infrastruktur(server) bertambah khususnya bagian storage
  2. Data yang diakses oleh user besar akibatnya performa website/aplikasi menjadi kurang optimal.