request ajax codeigniter dengan csrf token error 403 forbidden

selamat pagi para mastah sekolah koding..

saya sedang mencoba framework codeigniter 3.1 menggunakan ajax dan csrf token tetapi ketika saya coba click tombol requestnya dapet error

 403 (forbidden)

saya agak bingung dengan error nya..

ini adalah script jquery saya.

 $(document).on('click', '#submit', function(e){
          let user = $('input[name=username]').val();
          let pass = $('input[name=password]').val();
          let token= '<?php echo $this->security->get_csrf_hash() ?>';

          $.ajax({
            method: "POST",
            url: "<?php echo site_url('login'); ?>",
            data: {username:user,password:pass,csrf:token},
            dataType: "JSON",
            success: function(res){
              console.log(res.name);
            }
          })
        });

dan ini adalah script controller saya.

 $csrf = array(
			'name' => $this->input->post('csrf')
		);
		echo json_encode($csrf);

saya udah coba cari - cari masalah yang sama di mbah tapi belum nemu solusinya...

apakah ada yang pernah mengalami hal yang sama, bisa dishare mastah solusinya..

trus di user guide codeigniternya ada cara untuk mem whitelisted dari csrf protection nya.. dan saya coba berhasil error nya hilang tetapi apakah aman dengan cara seperti itu ?

terima kasih sebelumnya para mastah sekolah koding.

avatar BadRabbit
@BadRabbit

149 Kontribusi 56 Poin

Diperbarui 5 tahun yang lalu

2 Jawaban:

csrf namenya apa gan? Bisa dilihat bagian confignya?

avatar AriSudarma
@AriSudarma

5 Kontribusi 0 Poin

Dipost 5 tahun yang lalu

Jawaban Terpilih

oke sudah ketemu gan cara nya...

jadi kalo yang saya baca" dari permasalah yang sama kaya saya di mbah, penyebabnya itu karena csrf token di codeigniter 3.* itu setiap saat selalu berubah ubah setiap kali di POST maupun di GET melalui ajax request ataupun php native codeigniternya...

nah ada 2 cara bagaimana supaya pada saat di request melalui ajax agar tidak error <pre> 403 forbidden </pre>

cara pertama yaitu dengan menambahkan ajaxsetup lalu mengubah nilai csrf generate di file config menjadi FALSE. ajaxsetup ini mirip kaya framework laravel kalo misalkan mau pake ajax di laravel. contoh...?? <pre> $(document).ready(function(){ $.ajaxSetup({ data: { '&lt;?php echo $this-&gt;security-&gt;get_csrf_token_name(); ?&gt;' : '&lt;?php echo $this-&gt;security-&gt;get_csrf_hash(); ?&gt;' } });

$(document).on('click', '#submit', function(e){ let user = $('input[name=username]').val(); let pass = $('input[name=password]').val(); let token= '&lt;?php echo $this-&gt;security-&gt;get_csrf_hash() ?&gt;';

      $.ajax({
        method: &quot;POST&quot;,
        url: &quot;&amp;lt;?php echo site_url(&#039;login&#039;); ?&amp;gt;&quot;,
        data: {username:user,password:pass,csrf:token},
        dataType: &quot;JSON&quot;,
        success: function(res){
          console.log(res.name);
        }
      })
    });

} </pre>

file config <pre> $config['csrf_regenerate'] = FALSE; </pre> tetapi cara ini tidak direkomendasikan karena berbahaya katanya sih.. hehe

cara kedua dengan menggunakan form serialize jquery lalu kita refresh tokennya kemudian passing token tersebut ke input hiddennya. contoh..?? <pre> $(document).on('click', '#submit', function(e){ $.ajax({ method: "POST", url: "&lt;?php echo site_url('login'); ?&gt;", data: $('#form').serialize(), dataType: "json", success: function(res){ //dibawah ini token yang kita refresh di controller kemudian di pasing ke input hiddennya. $('input[name=csrf_test_name]').val(res.token); console.log(res.token); } }) }); </pre> file controller di codeigniternya. <pre> $data = array( 'token' =&gt; $this-&gt;security-&gt;get_csrf_hash() ); echo json_encode($data); </pre> nah kalo ini yang direkomendasikan..

intinya sih kalo yang saya baca baca dari mbah, kalo mau menggunakan csrf token di codeigniter dengan ajax jquery, kita harus refresh token tersebut kemudian gimana caranya di passing lagi ke input hiddennya.. yah kurang lebih seperti itu..

oke terima kasih sebelumnya untuk yang sudah mau membantu saya dalam menjawab pertanyaan ini.

kalo misalkan ada cara yang lebih baik dan lebih simple bisa dishare disini supaya bisa menjadi bahan referensi.

salam #[SK]lovers

avatar BadRabbit
@BadRabbit

149 Kontribusi 56 Poin

Dipost 5 tahun yang lalu

Login untuk ikut Jawaban