1. Laravel
  2. PHP

Laravel Mass Assignment Vulnerability

Salah satu celah keamanan yang paling sering terjadi disebabkan oleh kesalahan kode yang dilakukan oleh seorang developer. Salah satu celah keamanan yang kadang terlupakan adalah masalah Mass Assignment Vulnerability. Mass assignment ternyata memiliki masalah serius terkait dengan security jika kita tidak cermat dalam menggunakan fitur ini. Pada tutorial kali ini kita akan membahas menangani Mass Assignment Vulnerability pada Laravel.

Sebelum membahas mengenai celah keamanan pada fitur Mass Assignment, jika anda belum mengetahui apa Mass Assignment itu? Silahkan kunjungi artikel saya mengenai Mass Assignment dan cara mengimplementasikan Mass Assignment pada Laravel.

Keamanan adalah salah satu faktor yang harus sangat diperhatikan ketika kita membuat sebuah website. Dan ada banyak faktor yang menyebabkan sebuah website memiliki celah keamanan misalnya masalah server, jaringan, kode yang ditulis, dan lain sebagainya. Pada artikel kali ini kita akan membahas salah satu celah keamanan yang disebabkan oleh kesalahan kode yang ditulis.

Seperti telah dibahas pada pembuka artikel ini Mass Assignment memiliki masalah serius terkait dengan keamanan, tahukah anda bahwa website sebesar Github juga pernah terkena hack karena masalah Mass Assignment?

Melihat pentingnya untuk mengatasi masalah Mass Assignment Vulnerability ini, mari kita mulai membahas bagaimana masalah ini bisa terjadi dan cara menghindari celah keamanan ini.

Kita akan mencoba mendemokan celah keamanan pada fitur Mass Assignment pada Laravel. Di asumsikan kita memiliki sebuah table users dengan skema seperti ini:

KolomTipe Data
idbigint(20) unsigned Auto Increment
namevarchar(255)
emailvarchar(255)
passwordvarchar(255)
is_adminboolean
created_attimestamp NULL
updated_attimestamp NULL

Kemudian misalkan kita juga memiliki sebuah halaman dengan akses administrator untuk membuat user baru dengan tampilan seperti ini.

Laravel Mass Assignment Vulnerability - Create User

Untuk menyimpan data, kita memiliki kode seperti ini pada Controller.

public function store(Request $request)
{
    User::create($request->all());
}

Seperti kita ketahui, untuk bisa menyimpan data dengan menggunakan kode diatas, kita perlu mendaftarkan semua field yang ada pada form tersebut agar diizinkan untuk di assign menggunakan Mass Assignment.

protected $fillable = [
    'name',
    'email',
    'password',
    'is_admin'
];

Ketika kita mencoba untuk membuat user baru menggunakan form diatas, semua data tersimpan dengan nilai yang sesuai dengan input pada form. Sekilas, tidak ada masalah pada proses ini. Akan tetapi ada suatu celah keamanan pada proses ini. Mari kita bahas dimana celah keamanannya.

Seperti aplikasi website pada umumnya, biasanya sebuah website membership menyediakan sebuah halaman untuk mengupdate profile untuk user. Sebagai contoh kita memiliki halaman untuk update profile seperti ini.

Laravel Mass Assignment Vulnerability - Edit Profile

Pada gambar diatas pengguna hanya memiliki input nama dan email address yang artinya pengguna hanya diizinkan untuk mengupdate 2 data diatas saja.

Seperti telah dijelaskan sebelumnya, bahwa proses diatas memiliki celah keamanan terkait masalah Mass Assignment. Pengguna bisa menambahkan sebuah data pada HTTP request pada halaman diatas dan mengupdate data pada database yang seharusnya tidak bisa mereka lakukan. Untuk lebih jelasnya, dibawah ini merupakan salah satu contoh bagaimana user mengatur data mereka sebagai seorang administrator.

Laravel Mass Assignment Vulnerabilities

Seperti kita lihat pada contoh demo diatas, user bisa mengupdate data yang seharusnya tidak boleh mereka lakukan, padahal tidak ada input untuk data is_admin pada form edit profile.

Masalah ini terjadi karena kita mendaftarkan attribute is_admin pada property $fillable pada model, artinya mengizinkan attribute is_admin untuk di assign menggunakan Mass Assignment. Seperti itulah Mass Assignment Vulnerabilities bisa terjadi pada website yang kita bangun.

Untuk menghindari permasalahan ini, kita harus cermat dalam memilih attribute-attribute yang dibolehkan untuk di-assign menggunakan Mass Assignment. Singkatnya, semua attribute yang mengandung data sensitive lebih baik tidak di masukan dalam list $fillable.

Lalu bagaimana jika kita perlu mengisi salah satu field sensitive seperti is_admin diatas melalui form? Sementara memasukkan attribute ini pada property $fillable merupakan sebuah kesalahan.

Solusinya yaitu dengan tidak memasukkan attribute ini pada property $fillable, kemudian sedikit merubah kode yang kita buat pada area administrator pada saat menyimpan data.

public function store(Request $request)
{
    // Kode ini akan meng-assign semua attribute pada property $fillable
    $user = new User($request->all());
    
    // Mengatur nilai is_admin sesuai input 
    $user->is_admin = $request->input('is_admin');
    
    $user->save();
}

Untuk update profile kita tetap bisa menggunakan kode update seperti dibawah ini tanpa masalah Mass Assignment, karena hanya data yang di izinkan saja yang bisa user update.

public function update(Request $request, User $user)
{
    $user->update($request->all());
    //
}

Seperti itulah cara mencegah Mass Assignment Vulnerability pada Laravel. Sebuah Framework memang sangat membantu dan mempercepat proses development, akan tetapi perlu diperhatikan juga kode yang kita buat dengan menggunakan framework tersebut. Menggunakan framework yang dikenal sangat aman pun akan menjadi tidak aman jika kita tidak menggunakan kode yang benar.

Comments to: Laravel Mass Assignment Vulnerability

    Your email address will not be published. Required fields are marked *

    Attach images - Only PNG, JPG, JPEG and GIF are supported.