CSRF Codeigniter 2 dan AJAX

Asumsi saya temen-temen semua sudah mendengar atau mungkin menggunakan CSRF_PROTECTION di Codeigniter (CI) 2.0.

Kalau ada yang belum ngerti tentang CSRF, ada baiknya membaca tautan berikut Cross Site Request Forgery (CSRF).

Lokasi konfigurasi CSRF

Anda bisa menemukan konfigurasi CSRF pada CI2 di file config.php, kemudian cari baris-baris kode berikut:

….
$config[‘csrf_protection’] = FALSE;
$config[‘csrf_token_name’] = ‘csrf_test_name’;
$config[‘csrf_cookie_name’] = ‘csrf_cookie_name’;
$config[‘csrf_expire’] = 7200;
$config[‘csrf_exclude_uris’] = array();
…. 

Aslinya CSRF Protection dalam status tidak aktif (FALSE) , jika Anda ingin mengaktifkan ubah “FALSE” menjadi “TRUE”.

$config[‘csrf_token_name’] adalah variabel yang merekam nama variabel csrf yang nantinya akan anda gunakan untuk mendapatkan nilai kode dari csrf.

$config[‘csrf_cookie_name’] adalah csrf yang ada di cookie, nantinya akan anda gunakan untuk mendapatkan nilai kode dari csrf.

Cara Kerja

Jika Anda menggunakan form_helper.php untuk membuat kode html formulir dengan metode form_open() dan form_close(), maka akan terdapat hidden value secara otomatis, contohnya sebagai berikut:

<div style=”display:none”> <input type=”hidden” name=”csrf_test_name” value=”98dc3cb635ecec1cfe331e8273a90866”> </div>

csrf_test_name diambil dari config.php di baris kode berikut:

$config[‘csrf_token_name’] = ‘csrf_test_name’;

Jika Anda lihat di Cookies pada peramban Anda, cari cookies dengan nama csrf_cookie_name , maka akan terdapat isi kode csrf juga seperti yang di formulir sesuai dengan contoh di atas.

Data kode csrf yang ada di formulir (hidden value) dan di cookies dapat kita manfaatkan di AJAX.

Implementasi di AJAX

Saya akan memberi contoh per kasus saja. Peralatan yang diperlikan adalah:

  • Jquery
  • Jquery Cookie

Kasus 1
Baris kode berikut adalah contoh untuk mengambil nilai dari hidden value:

var cct = $(“input[name=csrf_test_name]”).val();
$.post(URL, { ‘csrf_test_name’: cct });

Kasus 2
Kasus berikut untuk mengambil kode csrf dari cookies

jQuery.ajax({
    dataType: “text”,
    type: “POST”,
    data: ‘data=’+data+’&csrf_test_name=’+$.cookie(‘csrf_cookie_name’),
    url:  datasource,
    success: function(returned_html){
      …
   }
});

Kasus 3
Kasus ini bisa dibilan kurang elegan karena akan terdapat 2 paramater yang sama, monggo kalau ada solusi dari temen-temen yang lebih elegan.

form.submit(function(e){
   e.preventDefault();
   var form_serialize = form.serialize();
   form_serialize +=‘&csrf_test_name=’+$.cookie(‘csrf_cookie_name’);
   $.post(form.attr(‘action’), form_serialize, function(data){
      ….
   });
}); 

Contoh-contoh di atas menggunakan nilai asli dari config.php, jika Anda menggantinya, pastikan untuk merekamnya di variabel javascript terlebih dahulu, caranya bisa menggunakan cara berikut:

Di Controller

$csrf_name = $this->security->get_csrf_token_name();

Di View

<script>
   var csrf_name = ‘<?php echo $csrf_name; ?>’;
   …
   …$.cookie(csrf_name)…
   … 
</script>

Kendala di JQueryUploadUI (Crsf_exclude_uris)

Kebuntuan terjadi ketika saya menemukan sebuah kasus yang menggunakan JQueryFileUpload , ketimbang pusing , saya cukup memasukkan target URI di config.php pada variabel berikut:

$config[‘csrf_exclude_uris’] = array(‘file/upload’);

CSRF Expire

Nilai standar waktu kadaluarsa CSRF yaitu 7200 detik, saya tanyakan ke temen saya — @linxlunx yang kompetensinya di keamanan situs, waktu standard itu sudah cukup.

The shorter the period in which these cookies are valid, the smaller the window of opportunity for a hacker to exploit your Web application

dan dia juga menyampaikan:

…tapi untuk keefektifannya sendiri, pencegahan CSRF harusnya lebih diintikan di pembatasan external sites di dalam sistem, misalnya kayak kemaren yang kita diskusikan perihal <iframe> itu mas, misal user cuma bisa masukin situs mana aja dalam artikel yang dipostingnya..

Demikian, mudah-mudahan berguna.

  1. klanjabrik posted this

Blog comments powered by Disqus