Skip to main content

Tự động thêm CSRF Token vào mọi truy vấn Ajax trong CodeIgniter

codeigniter-csrf-security-token-ajax-request

Trong CodeIgniter, khi bạn thiết lập cấu hình bật bảo vệ CSRF (Cross Site Request Forgery) trong config.php $config['csrf_protection'] = TRUE; thì mọi truy vấn từ client tới server đều được kiểm tra xem có chứa token hay không. Khi làm việc với các truy vấn ajax thì bạn sẽ phải thêm tham số token vào thủ công khá là mệt. Trong bài viết này, mình sẽ chỉ các bạn một cách để tự động thêm token vào mọi truy vấn ajax.

Các thư viện cần sử dụng

Chúng ta sẽ dùng tới jQuery và một plugin với tên gọi JS Cookies.

Tự động thêm CSRF Token vào mọi truy vấn Ajax

Để làm việc này, chúng ta sẽ sử dụng API ajaxSetup(), với API này thì chúng ta có thể thiết lập trước các tùy chọn mặc định cho mọi truy vấn tiếp theo được gọi qua ajax(), get() hoặc post().

// Auto add CSRF token to all Ajax requests
$.ajaxSetup({
  beforeSend: function(xhr, settings) {
    if (settings.data.indexOf('csrf_test_name') === -1) {
      settings.data += '&csrf_test_name=' + encodeURIComponent(Cookies.get('csrf_cookie_name'));
    }
  }
});

beforeSend - cái tên nói lên tất cả - đây là một hook sẽ được gọi trước mọi truy vấn ajax. Tại đây, chúng ta có thể thêm, sửa hoặc xóa dữ liệu của một truy vấn. Tớ sẽ dùng câu điều kiện If để kiểm tra xem trong dữ liệu truyền đi có chứa CSRF token hay chưa, nếu chưa thì chèn thêm vào cuối dữ liệu.

Chú ý: csrf_test_namecsrf_cookie_name là giá trị các bạn thiết lập trong config.php nhé!

$config['csrf_protection'] = TRUE;
$config['csrf_token_name'] = 'csrf_test_name';
$config['csrf_cookie_name'] = 'csrf_cookie_name';
$config['csrf_expire'] = 7200;
$config['csrf_regenerate'] = TRUE;
$config['csrf_exclude_uris'] = array();

Nếu không muốn sử dụng plugin JS Cookies thì các bạn có thể tự viết một hàm đơn giản như sau:

function getToken() {
  var ck = document.cookie.match(/csrf_cookie_name=([a-z0-9]+)/);
  if (ck.length === 2) return ck[1];
  return null;
}


Share this with your friends
Loading...