JrengGo

Solusi Masalah CSRF Token pada DataTable Server Side

Mar 2nd, 2022
1,347
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 4.18 KB | None | 0 0
  1. <?php
  2. //Berikut cara mengatasi seputar masalah csrf Token ketika regenerate setting ke true Ala Abdul Azis (JrengGo)
  3. //saya misalkan untuk kasus menampilkan Data Page list via datatable server side
  4. //1. set up .env seperti di bawah
  5.     security.csrfProtection = 'cookie'
  6.     security.tokenRandomize = false
  7.     security.tokenName = 'csrf_jrenggo'  (//sesuaikan nama masing-masing token csrf nya)
  8.     security.headerName = 'X-CSRF-TOKEN'
  9.     security.cookieName = 'csrf_cookie_secure' //mau diganti atau default bebas
  10.     security.expires = 5000
  11.     security.regenerate = true
  12.     security.redirect = false //(true or false bebas sesuai keinginan Default : false{redirect manual});
  13.  
  14. // 2. Controller Setup
  15. //buat method untuk menampilkan data server side (sesuaikan nama field masing masing dan object atau array bebas sesuka hati)
  16.     public function listpage()
  17.     {
  18.         if ($this->request->isAJAX()) {
  19.             $lists =  $this->page->get_datatables();
  20.             $csrfName = csrf_token();
  21.             $csrfHash = csrf_hash();
  22.             $data = [];
  23.             $no = $this->request->getPost("start");
  24.             foreach ($lists as $li) {
  25.                 $no++;
  26.                 $row = [];
  27.                 $row[] = $no;
  28.                 $row[] = $li->judul;
  29.                 $row[] = '<a target="_blank" href="hal/' . $li->judul_seo . '">hal/' . $li->judul_seo . '</a>';
  30.                 $row[] = $li->tgl_posting;
  31.                 $row[] = b_action($li->id_halaman);
  32.                 $data[] = $row;
  33.             }
  34.             $output = [
  35.                 "draw" => $this->request->getPost("draw"),
  36.                 "recordsTotal" => $this->page->count_all(),
  37.                 "recordsFiltered" => $this->page->count_filtered(),
  38.                 "data" => $data,
  39.             ];
  40.             $output[$csrfName] = $csrfHash;  //wajib disertakan agar nilai hash bisa dipassing via json ke views sesuai nama token                                      masing masing
  41.             echo json_encode($output); //passing data ke views
  42.         } else {
  43.             exit(throw \CodeIgniter\Exceptions\PageNotFoundException::forPageNotFound());  //lempar exit untuk secure tambahan
  44.         }
  45.     }
  46. ?>
  47.  
  48. 3. berikutnya setting ke views
  49. //sesuaikan dengan pribadi coding agan semua
  50. //input type hidden wajib disertakan
  51. <!DOCTYPE html>
  52. <html>
  53. <div class=" table-responsive">
  54.     <input type="hidden" name="<?= csrf_token() ?>" value="<?= csrf_hash() ?>" id="csrfJrenggo" />
  55.     <table id="showData" class="table table-bordered table-striped">
  56.         <thead>
  57.             <tr>
  58.                 <th style="width:5px;">No.</th>
  59.                 <th>Judul</th>
  60.                 <th>Link</th>
  61.                 <th>Tgl Post</th>
  62.                 <th style="width:50px;">Act</th>
  63.             </tr>
  64.         </thead>
  65.         <tbody>
  66.  
  67.         </tbody>
  68.     </table>
  69. </div>
  70. <script>
  71.     $(document).ready(function() {
  72.         $('#showData').DataTable({
  73.             'destroy': true,  //kutip satu pada tulisan destroy boleh dibuang atau digunakan bebas
  74.                                     //begitu untuk responsive autoWidth processing dll
  75.             'responsive': true,
  76.             'autoWidth': false,
  77.             'processing': true,
  78.             'serverSide': true,
  79.             'order': [],
  80.             'ajax': {
  81.                 'url': "<?= base_url('s/viewp'); ?>",
  82.                 'type': 'POST',
  83.                 "data": {
  84.                     csrf_jrenggo: $('input[name=csrf_jrenggo]').val(),  //ambil nilai csrf sesuai nama token input dari .env (wajib)
  85.                 },
  86.                 "data": function(data) {
  87.                     data.csrf_jrenggo = $('input[name=csrf_jrenggo]').val() //function bridge token view to controller (wajib)
  88.                 },
  89.                 "dataSrc": function(response) {
  90.                     $('input[name=csrf_jrenggo]').val(response.csrf_jrenggo); //dataSrc untuk random request token char (wajib)
  91.                     return response.data;
  92.                 },
  93.             },
  94.             'columnDefs': [{
  95.                 'targets': [0, 4], //sesuaikan kolom yang tidak mau di sort
  96.                 'orderable': false
  97.             }, ],
  98.         })
  99.     })
  100. </script>
  101. </html>
Add Comment
Please, Sign In to add comment