CSRF (Cross-site Request Forgery) adalah salah satu jenis serangan keamanan web untuk mendapatkan atau mengirim request yang dieksekusi atas wewenang korban, tanpa dikehendakinya. Serangan CSRF dapat terjadi disebabkan karena tidak ada mekanisme perlindungan token keamanan (request token) pada sebuah website, sehingga penyerang dapat mengirim suatu request (misal: submit suatu form) secara illegal yaitu tidak melalui form yang ada di website tersebut secara langsung. Jika korban tidak berhati-hati, serangan CSRF dapat sukses dilakukan dengan memaksa pengguna untuk melakukan permintaan mengubah data seperti profil pribadi, alamat email, bahkan yang lebih berbahaya melakukan transaksi transfer dana.

Untuk itu penting sekali untuk menerapkan mekanisme perlindungan CSRF (CSRF Protection) di website kita. Kali ini kita akan membahas Pengaturan CSRF Protection di aplikasi web berbasis Codeigniter 3.0. Mekanisme CSRF Protection sebenarnya sudah ada di framework Codeigniter sejak versi 2.x.x, namun di versi Codeigniter 3.0 terdapat beberapa pengaturan tambahan yang disediakan untuk meningkatkan tingkat keamanan.

Konfigurasi

Untuk mengaktifkan CSRF Protection di Codeigniter 3.0 kita perlu mengubah pengaturan di file /application/config/config.php


$config['csrf_protection'] = TRUE;    // SET TRUE UNTUK ENABLE CSRF PROTECTION
$config['csrf_token_name'] = 'csrf_test_name';        // NAMA CSRF TOKEN YANG AKAN DIGUNAKAN
$config['csrf_cookie_name'] = 'csrf_cookie_name';    // NAMA CSRF COOKIE YANG AKAN DIGUNAKAN
$config['csrf_expire'] = 7200;        // JANGKA WAKTU CSRF TOKEN EXPIRED (DALAM DETIK)
$config['csrf_regenerate'] = TRUE;    // JIKA TRUE MAKA CSRF TOKEN AKAN DI GENERATE ULANG UNTUK SETIAP REQUEST
$config['csrf_exclude_uris'] = array();    // ARRAY BERISI LIST URI YANG TIDAK MENGGUNAKAN CSRF PROTECTION

Pengaturan di atas adalah pengaturan CSRF Protection di Codeigniter 3.0. Terdapat beberapa konfigurasi tambahan yang tidak ada di Codeigniter 2.x.x seperti $config['csrf_regenerate'] dan $config['csrf_exclude_uris']. Dengan pengaturan tambahan yang disediakan di Codeigniter 3.0 tersebut kita dapat dengan mudah mengatur Action apa saja di Controller yang tidak perlu menerapkan CSRF Protection, misalnya Action berupa AJAX. Serta tambahan konfigurasi $config['csrf_regenerate'] yang memungkinkan CSRF Token digenerate ulang untuk setiap request yang dilakukan, sehingga aplikasi menjadi lebih aman.

Form

Dengan mengaktifkan CSRF Protection di Codeigniter 3.0 kita perlu memodifikasi form yang kita buat menggunakan form helper dari Codeigniter. Hal ini diperlukan karena secara otomatis Codeigniter akan menambahkan input token pada setiap form yang kita buat.


echo form_open(site_url('register/index'), array('class' => 'form-horizontal', 'role' => 'form');
. . . . .
echo form_close();

Mungkin akan cukup merepotkan kalau harus mengubah form yang telah kita buat menggunakan form helper. Alternatif lain yang bisa dilakukan adalah dengan menambahkan satu buah input hidden yang berisi CSRF Token di setiap form yang telah kita buat.


<form method="POST" action="<?=site_url('register/index')?>" class="form-horizontal" role="form">
    <input type="hidden" name="<?=$this->security->get_csrf_token_name();?>" value="<?=$this->security->get_csrf_hash();?>" style="display: none">
. . . .
</form>

AJAX Request

Dengan mengaktifkan CSRF Protection maka untuk semua POST request harus menyertakan CSRF token agar request tersebut dinilai valid. Begitu juga untuk request POST yang berupa AJAX. Ada dua cara yang dapat dilakukan untuk mengatasi hal ini. Yang pertama kita bisa menambahkan action atau fungsi controller yang berupa request AJAX ke dalam konfigurasi $config['csrf_exclude_uris'] , sehingga CSRF Protection akan di hilangkan untuk action atau fungsi tersebut. Yang kedua kita bisa menambahkan CSRF Token untuk semua AJAX request POST yang akan kita lakukan. Jika AJAX request yang kita lakukan menggunakan jquery, kita dapat menggunakan fungsi $.ajaxSetup untuk secara otomatis meynertakan CSRF Token di semua AJAX request yang kita lakukan.


var csfrData = {};
csfrData['<?php echo $this->security->get_csrf_token_name(); ?>'] = '<?php echo
$this->security->get_csrf_hash(); ?>';
$.ajaxSetup({
data: csfrData
});

Atau kita juga bisa menambahkan CSRF Token satu persatu di AJAX request yang kita lakukan.


$.ajax({
    url: '<?php echo site_url("post/update") ?>',
    type: 'POST',
    dataType: 'json',
    data: {
        data: 'data', 
        <?php echo $this->security->get_csrf_token_name(); ?>: '<?php echo
$this->security->get_csrf_hash(); ?>'
    },
});

Author Image

Fery Dedi Supardi

I grew up in Magetan, East Java. I have my university degree majoring Informatics Engineering from Brawijaya University, Malang. In 2013, I designed a. . .


Published

Hello World!

Ini adalah posting pertama di blog baru saya Fery Code. Semoga tetap konsisten untuk menulis di blog ini untuk berbagi ilmu dan pengalaman, kh. . .


Published