Làm cách nào để chuyển mã thông báo CSRF trong Ajax Javascript?

Yêu cầu giả mạo yêu cầu trên nhiều trang web (CSRF) là một loại khai thác độc hại theo đó các lệnh trái phép được thực hiện thay mặt cho người dùng được xác thực

CodeIgniter 4 cung cấp khả năng bảo vệ khỏi các cuộc tấn công CSRF. Nhưng nó không được bật theo mặc định giống như CodeIgniter 3

Mã thông báo được tạo cho mỗi người dùng và được CodeIgniter quản lý để xác minh yêu cầu của người dùng

Trong hướng dẫn này, tôi chỉ cho bạn cách kích hoạt tính năng bảo vệ CSRF và gửi yêu cầu AJAX bằng mã thông báo CSRF trong dự án CodeIgniter 4

Làm cách nào để chuyển mã thông báo CSRF trong Ajax Javascript?

Demo Tải xuống


nội dung

  1. Cấu hình cơ sở dữ liệu
  2. Kích hoạt CSRF
  3. Tạo bảng
  4. Kiểu mẫu
  5. Tuyến đường
  6. Bộ điều khiển
  7. Lượt xem
  8. Chạy
  9. Thử nghiệm
  10. Phần kết luận

1. Cấu hình cơ sở dữ liệu

  • Mở tệp
    security.tokenName = 'csrf_hash_name' 
    security.headerName = 'X-CSRF-TOKEN' 
    security.cookieName = 'csrf_cookie_name' 
    security.expires = 7200 
    security.regenerate = true
    4 có sẵn tại thư mục gốc của dự án

LƯU Ý – Nếu chấm (. ) không được thêm vào lúc bắt đầu, sau đó đổi tên tệp thành. env

  • Xóa # khỏi đầu cơ sở dữ liệu. mặc định. tên máy chủ, cơ sở dữ liệu. mặc định. cơ sở dữ liệu, cơ sở dữ liệu. mặc định. tên người dùng, cơ sở dữ liệu. mặc định. mật khẩu và cơ sở dữ liệu. mặc định. DBDriver
  • Cập nhật cấu hình và lưu nó
database.default.hostname = 127.0.0.1
database.default.database = testdb
database.default.username = root
database.default.password = 
database.default.DBDriver = MySQLi

2. Bật CSRF

  • Mở lại tệp 
    security.tokenName = 'csrf_hash_name' 
    security.headerName = 'X-CSRF-TOKEN' 
    security.cookieName = 'csrf_cookie_name' 
    security.expires = 7200 
    security.regenerate = true
  • Xóa # khỏi đầu của 
    security.tokenName = 'csrf_hash_name' 
    security.headerName = 'X-CSRF-TOKEN' 
    security.cookieName = 'csrf_cookie_name' 
    security.expires = 7200 
    security.regenerate = true
    6,
    security.tokenName = 'csrf_hash_name' 
    security.headerName = 'X-CSRF-TOKEN' 
    security.cookieName = 'csrf_cookie_name' 
    security.expires = 7200 
    security.regenerate = true
    7, 
    security.tokenName = 'csrf_hash_name' 
    security.headerName = 'X-CSRF-TOKEN' 
    security.cookieName = 'csrf_cookie_name' 
    security.expires = 7200 
    security.regenerate = true
    8, 
    security.tokenName = 'csrf_hash_name' 
    security.headerName = 'X-CSRF-TOKEN' 
    security.cookieName = 'csrf_cookie_name' 
    security.expires = 7200 
    security.regenerate = true
    9, và
    // Always applied before every request
    public $globals = [
        'before' => [
           //'honeypot'
           'csrf',
        ],
        'after' => [
           'toolbar',
           //'honeypot'
        ],
    ];
    0
  • Tôi cập nhật giá trị 
    security.tokenName = 'csrf_hash_name' 
    security.headerName = 'X-CSRF-TOKEN' 
    security.cookieName = 'csrf_cookie_name' 
    security.expires = 7200 
    security.regenerate = true
    6 với 
    // Always applied before every request
    public $globals = [
        'before' => [
           //'honeypot'
           'csrf',
        ],
        'after' => [
           'toolbar',
           //'honeypot'
        ],
    ];
    2. Với tên này đọc băm CSRF. Bạn có thể cập nhật nó với bất kỳ giá trị nào khác
  • Nếu bạn không muốn tạo lại hàm băm CSRF sau mỗi yêu cầu AJAX thì hãy đặt _______73
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
  • Mở tệp
    // Always applied before every request
    public $globals = [
        'before' => [
           //'honeypot'
           'csrf',
        ],
        'after' => [
           'toolbar',
           //'honeypot'
        ],
    ];
    4
  • Bỏ bình luận
    // Always applied before every request
    public $globals = [
        'before' => [
           //'honeypot'
           'csrf',
        ],
        'after' => [
           'toolbar',
           //'honeypot'
        ],
    ];
    5 trong
    // Always applied before every request
    public $globals = [
        'before' => [
           //'honeypot'
           'csrf',
        ],
        'after' => [
           'toolbar',
           //'honeypot'
        ],
    ];
    6 nếu đã bình luận
// Always applied before every request
public $globals = [
    'before' => [
       //'honeypot'
       'csrf',
    ],
    'after' => [
       'toolbar',
       //'honeypot'
    ],
];

3. Tạo bảng

  • Tạo một bảng mới
    // Always applied before every request
    public $globals = [
        'before' => [
           //'honeypot'
           'csrf',
        ],
        'after' => [
           'toolbar',
           //'honeypot'
        ],
    ];
    7 bằng cách sử dụng di chuyển
database.default.hostname = 127.0.0.1
database.default.database = testdb
database.default.username = root
database.default.password = 
database.default.DBDriver = MySQLi
7
  • Bây giờ, điều hướng đến thư mục
    // Always applied before every request
    public $globals = [
        'before' => [
           //'honeypot'
           'csrf',
        ],
        'after' => [
           'toolbar',
           //'honeypot'
        ],
    ];
    8 từ thư mục gốc của dự án
  • Tìm một tệp PHP kết thúc bằng
    // Always applied before every request
    public $globals = [
        'before' => [
           //'honeypot'
           'csrf',
        ],
        'after' => [
           'toolbar',
           //'honeypot'
        ],
    ];
    9 và mở nó
  • Xác định cấu trúc bảng trong phương pháp
    database.default.hostname = 127.0.0.1
    database.default.database = testdb
    database.default.username = root
    database.default.password = 
    database.default.DBDriver = MySQLi
    70
  • Sử dụng phương pháp
    database.default.hostname = 127.0.0.1
    database.default.database = testdb
    database.default.username = root
    database.default.password = 
    database.default.DBDriver = MySQLi
    71 xóa bảng
    // Always applied before every request
    public $globals = [
        'before' => [
           //'honeypot'
           'csrf',
        ],
        'after' => [
           'toolbar',
           //'honeypot'
        ],
    ];
    7 gọi khi hoàn tác di chuyển
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
3
  • Chạy di chuyển -
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
4

4. Mô hình

  • Tạo 
    database.default.hostname = 127.0.0.1
    database.default.database = testdb
    database.default.username = root
    database.default.password = 
    database.default.DBDriver = MySQLi
    73 Mô hình –
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
6
  • Mở tệp 
    database.default.hostname = 127.0.0.1
    database.default.database = testdb
    database.default.username = root
    database.default.password = 
    database.default.DBDriver = MySQLi
    74 
  • Trong 
    database.default.hostname = 127.0.0.1
    database.default.database = testdb
    database.default.username = root
    database.default.password = 
    database.default.DBDriver = MySQLi
    75 Mảng chỉ định tên trường – 
    database.default.hostname = 127.0.0.1
    database.default.database = testdb
    database.default.username = root
    database.default.password = 
    database.default.DBDriver = MySQLi
    76 có thể đặt trong khi chèn và cập nhật

Mã hoàn thành

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
0

5. Tuyến đường

  • Mở tệp
    database.default.hostname = 127.0.0.1
    database.default.database = testdb
    database.default.username = root
    database.default.password = 
    database.default.DBDriver = MySQLi
    77
  • Xác định 2 tuyến đường –
    • / – Hiển thị chế độ xem người dùng
    • users/userDetails – Nó được sử dụng để gửi yêu cầu AJAX

Mã hoàn thành

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
2

6. Bộ điều khiển

  • Tạo bộ điều khiển
    database.default.hostname = 127.0.0.1
    database.default.database = testdb
    database.default.username = root
    database.default.password = 
    database.default.DBDriver = MySQLi
    78 –
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
4
  • Mở tệp
    database.default.hostname = 127.0.0.1
    database.default.database = testdb
    database.default.username = root
    database.default.password = 
    database.default.DBDriver = MySQLi
    79
  • Nhập mẫu
    database.default.hostname = 127.0.0.1
    database.default.database = testdb
    database.default.username = root
    database.default.password = 
    database.default.DBDriver = MySQLi
    73
  • Tạo 2 phương thức –
    • index() – Lấy tất cả các bản ghi từ bảng
      // Always applied before every request
      public $globals = [
          'before' => [
             //'honeypot'
             'csrf',
          ],
          'after' => [
             'toolbar',
             //'honeypot'
          ],
      ];
      7 và gán cho
      security.tokenName = 'csrf_hash_name' 
      security.headerName = 'X-CSRF-TOKEN' 
      security.cookieName = 'csrf_cookie_name' 
      security.expires = 7200 
      security.regenerate = true
      32. Tải chế độ xem
      // Always applied before every request
      public $globals = [
          'before' => [
             //'honeypot'
             'csrf',
          ],
          'after' => [
             'toolbar',
             //'honeypot'
          ],
      ];
      7 và vượt qua Mảng
      security.tokenName = 'csrf_hash_name' 
      security.headerName = 'X-CSRF-TOKEN' 
      security.cookieName = 'csrf_cookie_name' 
      security.expires = 7200 
      security.regenerate = true
      34
    • userDetails() – Phương thức này được sử dụng để xử lý yêu cầu AJAX. Với phương thức này trả về dữ liệu người dùng ở định dạng JSON theo tên người dùng

Đọc các giá trị POST và gán vào biến

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
35. Tạo Mảng
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
34 để lưu trữ phản hồi trả về. Chỉ định mã thông báo CSRF mới cho
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
37

xác định xác thực. Nếu giá trị POST không hợp lệ thì gán

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
38 cho
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
39 và thông báo lỗi cho
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
40

Nếu giá trị hợp lệ thì gán

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
41 cho
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
39 và tìm nạp bản ghi theo tên người dùng từ bảng
// Always applied before every request
public $globals = [
    'before' => [
       //'honeypot'
       'csrf',
    ],
    'after' => [
       'toolbar',
       //'honeypot'
    ],
];
7. Chỉ định bản ghi đã tìm nạp cho
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
44

Trả lại Mảng

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
34 ở định dạng JSON

Mã hoàn thành

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
0

7. Xem

Tạo tệp

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
46 trong
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
47

Tạo một phần tử ẩn để lưu trữ tên mã thông báo CSRF được chỉ định trong tệp

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
4 trong thuộc tính
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
49 và lưu trữ hàm băm CSRF trong thuộc tính
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
60

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
1

Thêm tên người dùng vào

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
61 bằng cách lặp trên
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
62. Lưu trữ
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
63 trong thuộc tính
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
60

Để hiển thị thông tin chi tiết về người dùng đã chọn đã tạo ____265 phần tử

Kịch bản -

Xác định sự kiện

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
66 trên
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
67

Đọc tên mã thông báo CSRF và hàm băm từ trường ẩn và gán nó cho

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
68 và
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
69

Chỉ định giá trị tùy chọn đã chọn cho biến

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
00

Gửi yêu cầu AJAX POST tới

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
01. Chuyển tên người dùng và hàm băm CSRF dưới dạng dữ liệu –
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
02 là 
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
03

Ở đây, hàm băm sẽ trôi qua như thế nào –

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
04

Đặt

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
05. Khi gọi lại thành công, chỉ định
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
06 cho
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
07. Làm trống các phần tử
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
65

Nếu

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
09 thì lặp lại trên
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
20 để đọc dữ liệu người dùng. Cập nhật giá trị văn bản
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
65 với dữ liệu người dùng

Nếu

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
22 không bằng
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
38 thì cảnh báo
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
24

Mã hoàn thành

security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
2

8. Chạy

  • Điều hướng đến dự án và
  • Thực hiện lệnh "php spark phục vụ"
security.tokenName = 'csrf_hash_name' 
security.headerName = 'X-CSRF-TOKEN' 
security.cookieName = 'csrf_cookie_name' 
security.expires = 7200 
security.regenerate = true
3
  • Chạy
    security.tokenName = 'csrf_hash_name' 
    security.headerName = 'X-CSRF-TOKEN' 
    security.cookieName = 'csrf_cookie_name' 
    security.expires = 7200 
    security.regenerate = true
    25 trong trình duyệt web

9. Bản trình diễn

Xem bản trình diễn


10. Kết luận

Mã thông báo CSRF không bắt buộc phải gửi với yêu cầu AJAX GET. Nếu bạn đã bật tạo mã thông báo CSRF thì bạn cần cập nhật mã thông báo sau mỗi yêu cầu như tôi làm trong ví dụ

Làm cách nào để gửi mã thông báo CSRF bằng AJAX?

Sử dụng mã thông báo csrf bên trong yêu cầu Ajax . Include a jquery file in your html as we are going to make use of $. ajaxSetup() và $. ajax để thực hiện cuộc gọi ajax. Bây giờ bấm vào nút Bấm vào tôi và xem thông báo được hiển thị.

Làm cách nào để nhận mã thông báo CSRF trong JavaScript?

Nếu bạn cần thực hiện một yêu cầu POST AJAX trong Laravel và bạn xem tài liệu, bạn có thể thấy giải pháp truy xuất mã thông báo CSRF trong jQuery như sau. var csrf = $('meta[name="csrf-token"]'). attr('nội dung');

{% CSRF token %} là gì?

Mã thông báo CSRF là một giá trị duy nhất, bí mật, không thể đoán trước được tạo bởi ứng dụng phía máy chủ và được truyền tới máy khách theo cách nó được bao gồm trong yêu cầu HTTP tiếp theo do máy khách thực hiện

Làm cách nào để sử dụng mã thông báo CSRF trong codeigniter AJAX?

Bật bảo vệ CSRF – .
Đặt TRUE $config['csrf_protection'] , điều này sẽ kích hoạt CSRF
Bạn có thể thay đổi giá trị mặc định của $config['csrf_token_name'] là 'csrf_test_name'. .
Đặt TRUE $config['csrf_regenerate'] nếu bạn muốn tạo lại hàm băm CSRF sau mỗi yêu cầu AJAX nếu không thì đặt nó là FALSE