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 ilegal yaitu tidak melalui form yang ada di website tersebut secara langsung. Jika korban tidak hati-hati, serangan CSRF dapat sukses dilakukan denganmemaksa pengguna untuk melakukan permintaan mengubah data seperti profil pribadi, alamat email, bahkan yang lebih berbahaya melakukan transaksi transfer dana.

Konfigurasi

Untuk mengaktifkan CSRF Protection pada Codeigniter 3, perlu dilakukan pengaturan di file /application/config/config.php

$config['csrf_protection'] = TRUE;  //set TRUE untuk mengaktifkan proteksi csrf
$config['csrf_token_name'] = 'csrf_test_name'; //nama token csrf yang akan digunakan
$config['csrf_cookie_name'] = 'csrf_cookie_name'; //nama cookie csrf yang akan digunakan
$config['csrf_expire'] = 7200; //jangka waktu csrf token expired, dalam detik
$config['csrf_regenerate'] = TRUE; //jika true maka token csrf akan digenerate ulang untuk setiap request
Form
Dengan mengaktifkan proteksi CSRF, perlu dilakukan modifikasi pada form input dengan cara menambahkan satu input hidden yang berisi CSRF Token di setiap form.
<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></div>
<div>
Ajax Request
Dengan mengaktifkan CSRF protection maka untuk semua post request harus menyertakan CSRF token agar request tresebut 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 dihilangkan untuk action atau fungsi tersebur. 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 menyertakan 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
});</div>
<div>
Atau kita juga bisa menambahkan CSRF token satu persatu di Ajax request.
$.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(); ?>'
},
});</div>
<div>
Atau dengan melakukan bypass proteksi csrf pada alamat tertentu, caranya dengan mengubah konfigurasi csrf pada file config.php
$config['csrf_exclude_uris'] = array("controllerx.*+");

Konfigurasi di atas berarti melakukan disable proteksi csrf pada alamat url yang dimulai dengan: controllerx, contonya “http://situs.com/controllerx/msg/1