J2TEAM Security: A must-have extension for Chrome users. Install now!

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

Sử dụng jQuery API để tự động thêm CSRF Security Token vào mọi truy vấn Ajax trong CodeIgniter khi bạn cấu hình bật bảo vệ CSRF (Cross Site Request Forgery)
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;
}

Leader at J2TEAM. Website: https://j2team.dev/

Đăng nhận xét

Cảm ơn bạn đã đọc bài viết!

- Bạn có gợi ý hoặc bình luận xin chia sẻ bên dưới.

- Hãy viết tiếng Việt có dấu nếu có thể!