JrengGo

Passing Token Pada DataTable ServerSide Update Data Button

Mar 2nd, 2022
949
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.66 KB | None | 0 0
  1. //Tips Ampuh Problem Solving CSRF Token Regenerate pada CodeIgniter 4 By : Abdul Azis (JrengGo)
  2. //Tips ini memecahkan problem seputar passing csrf pada ci4 khusus penggunaan DataTable ServerSide untuk AJAX Jquery sebagai langkah pengamanan form data validation random token
  3. //Tahap yang dapat dilakukan :
  4.  
  5. 1. set up .env seperti di bawah
  6. <?php
  7. security.csrfProtection = 'cookie'
  8. security.tokenRandomize = false
  9. security.tokenName = 'csrf_jrenggo'  (//sesuaikan nama masing-masing token csrf nya)
  10. security.headerName = 'X-CSRF-TOKEN'
  11. security.cookieName = 'csrf_cookie_secure'
  12. security.expires = 7200
  13. security.regenerate = true
  14. security.redirect = false  //(true or false bebas sesuai keinginan Default : false{redirect manual});
  15. ?>
  16. 2. set up Controller sebagai Passing Data Random dari csrf_hash()
  17. //setup controller di sini saya contohkan untuk kasus update data sebuah page(halaman)
  18.     //update modal data page
  19. <?php
  20.     public function updatemodal()
  21.     {
  22.         if ($this->request->isAJAX()) {
  23.             $judul = $this->request->getVar('j');
  24.             $isi = $this->request->getVar('i');
  25.             $image = $this->request->getFile('image');
  26.             $validasi = [
  27.                 'ju' => $judul, 'is' => $isi, 'im' => $image
  28.             ];
  29.             if (!$this->validation->run($validasi, 'page')) {
  30.                 $datas = [
  31.                     'error' => true,
  32.                     'p_error' => $this->validation->getErrors(),
  33.                     'csrf_jrenggo' => csrf_hash()  //wajib sertakakan nama token dan nilai token (nama token bebas) passing via JSON
  34.                 ];                
  35.             } else {
  36.                 $id = $this->request->getVar('id');
  37.                 $nama_image = $image->getRandomName();
  38.                 $image->move('assets/foto_news', $nama_image);
  39.                 $data1 = [
  40.                     'judul' => esc($judul),
  41.                     'judul_seo' => seo_title(esc($judul)),
  42.                     'isi_halaman' => $isi,
  43.                     'tgl_posting' => date('Y-m-d'),
  44.                     'gambar' => $nama_image
  45.                 ];
  46.                 $this->page->update($id, $data1);
  47.                 $datas = [
  48.                     'success' => true,
  49.                     'msg' => 'Data Success Update',
  50.                     'csrf_jrenggo' => csrf_hash() //wajib sertakakan nama token dan nilai token (nama token bebas) passing via JSON
  51.                 ];
  52.            }
  53.                 echo json_encode($datas);
  54.         } else {
  55.             exit(throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound());
  56.         }
  57.     }
  58. ?>
  59. 3. Setup Views untuk menampung nilai token random
  60. <script>
  61.         $(document).ready(function() {
  62.         $('#formUpdateHalaman').submit(function(e) {  //ambil ID form sesuaikan selera masing - masing (ex:#formUpdateHalaman)
  63.             e.preventDefault();
  64.             var getData = new FormData($(this)[0]);
  65.             $.ajax({
  66.                 type: "post",
  67.                 url: $(this).attr('action'),
  68.                 data: getData,
  69.                 enctype: 'multipart/form-data',
  70.                 cache: false,
  71.                 processData: false,
  72.                 contentType: false,
  73.                 dataType: "json",
  74.                 beforeSend: function() {
  75.                     $('#editSave').prop('disabled', true);
  76.                     $('#editSave').html('<i class="fas fa-pulse fa-spinner text-warning"></i>');
  77.                 },
  78.                 complete: function() {
  79.                     $('#editSave').prop('disabled', false);
  80.                     $('#editSave').html('Update Page')
  81.                 },
  82.                 success: function(response) {
  83.                     if (response.error) {
  84.           //nah... disini kita tangkap nilai hash dari nama token yang dibuat pada controller
  85.          //sesuaikan nama token masing-masing (ex : csrf_jrenggo);
  86.         //note: Pada Prinsipnya ketika kita menggunakan datatable server side secara otomatis sistem akan memiliki dua jenis token yang memiliki dua nilai hash berbeda. karna itu triknya adalah manfaakan ID dengan cara membuat dua ID berbeda pada masing masing csrf form input hidden pada datatable dan csrf hidden pada modal form update. (ex: #csrfToken dan #csrfRandom) kemudian update dua nilai ID tersebut dengan nilai hash yang dipassing dari controller (token name: csrf_jrenggo).
  87.                         if (response.csrf_jrenggo) {
  88.                             //update hash untuk proses error validation
  89.                             $('#csrfToken, #csrfRandom').val(response.csrf_jrenggo);      
  90.                         }
  91.                         if (response.p_error['ju']) {
  92.                             $('#j').addClass('is-invalid');
  93.                             $('.juError').html(response.p_error['ju']);
  94.                         } else {
  95.                             $('#j').removeClass('is-invalid');
  96.                             $('.juError').html('');
  97.                         }
  98.                        
  99.                         if (response.p_error['is']) {
  100.                             $('#ckeditor').addClass('is-invalid');
  101.                             $('.isError').html(response.p_error['is']);
  102.                         } else {
  103.                             $('#ckeditor').removeClass('is-invalid');
  104.                             $('.isError').html('');
  105.                         }
  106.                        
  107.                         if (response.p_error['im']) {
  108.                             $('#customFile').addClass('is-invalid');
  109.                             $('.imError').html(response.p_error['im']);
  110.                         } else {
  111.                             $('#customFile').removeClass('is-invalid');
  112.                             $('.imError').html('');
  113.                         }
  114.                     } else if (response.success) {
  115.                         //kembali update token hash untuk process success
  116.                         if (response.csrf_jrenggo) {
  117.                             $('#csrfToken, #csrfRandom').val(response.csrf_jrenggo);  
  118.                         }
  119.                         Swal.fire({
  120.                             icon: 'success',
  121.                             title: 'Success Edit',
  122.                             text: response.msg,
  123.                         })
  124.                         toastr.success('Data Success Updated', 'info');
  125.                         $('#editModal').modal('hide');
  126.                         PageShowList();
  127.                     }
  128.                 },
  129.                 error: function(xhr, ajaxOptions, thrownError) {
  130.                     alert(xhr.status + "/n" + xhr.responseText + "/n" + thrownError);
  131.                 }
  132.             });
  133.             return false;
  134.         })
  135.     });
  136. </script>
  137.  
  138.  
  139.  
Add Comment
Please, Sign In to add comment