Mengatasi Issue Long Password Denial of Service di Laravel | Security


Sebelum deliver projek ke client (terutama Kementerian) biasanya dari pihak PUSDATIN (Pusat Data dan Informasi) mereka melakukan Penetration Test (Pentest) terlebih dahulu terhadap aplikasi yang akan di deliver. Aplikasi tersebut akan ditest vulnerable-nya atau dicari celah keamanannya, dengan begitu akan mengurangi resiko pencurian data atau hacking. Dari beberapa Kementerian yang saya tangani selama ini, rata-rata menggunakan aplikasi Acunetix atau Burp Suite Scanner untuk mengetes celah keamanan aplikasi. 

Dari studi kasus yang pernah saya temui, salah satunya pernah saya temukan issue Long Password Denial of Service dari aplikasi Laravel dan statusnya itu High. Jadi resiko dari celah ini termasuk dalam golongan yang wajib diwaspadai oleh web developer. 

Apa sih Long password denial of service itu? 

Jadi issue ini bisa digunakan oleh Hacker untuk melakukan Denial of Service Attack (DoS) pada aplikasi kita, dengan mengirimkan password yang sangat panjang pada saat registrasi di aplikasi. Hal ini menyebabkan website menjadi tidak dapat diakses dan menjadi tidak responsive. Umumnya dikarenakan proses hasing pada saat menyimpan password ke database. Dalam hal ini untuk Laravel menggunakan Bcrypt. Ketika password yang sangat panjang di hash, akan menyebabkan CPU menjadi tinggi. 

Bagaimana cara mengatasinya?

Sebenarnya issue ini sangat mudah diatasi, tapi mengabaikan issue ini dapat berakibat Fatal. Untuk studi kasus menggunakan Framework Laravel yang menggunakan Bcypt sebagai hashingnya, hal pertama yang harus kita perhatikan bahwa Bcrypt mempunyai batas maksimum panjang password yang bisa di hash. Maksimum panjang password yang bisa di hash oleh Bcrypt adalah sekitar 50-72 bytes. Panjang hash itu sendiri tergantung pada implementasi Bcrypt yang kita gunakan. Apabila password yang kita inputkan itu lebih dari maksimum, maka password yang di hash akan dipotong oleh Bcrypt. 

Menurut saya pribadi sih akan jarang orang yang membuat password melebihi 50 bytes/karakter. Pasti akan susah untuk mengingat password yang panjangnya lebih dari 50 karakter. Jangankan 50 karakter, 20 karakter saja sudah susah diingat menurut saya. Jadi amannya, kita buat batasan maksimum pada inputan password sebanyak 40 atau 50 karakter saja pada saat registrasi. 

Bagi yang belum tahu bagaimana cara memberi batasan maksimum inputan di HTML, contohnya dibawah: 

<input id="password" type="text" class="form-control" name="password" placeholder="Password" maxlength="40" required>

Kita tinggal menambahkan maxlength="40" pada form inputan password. Voila! Issue tersebut akan hilang pada saat kembali dites. 

Bagaimana? Mudah bukan?