Như định nghĩa của CSRF nói
Mã thông báo CSRF là mã thông báo ngẫu nhiên an toàn (ví dụ: mã thông báo đồng bộ hóa hoặc
challenge token) được sử dụng để ngăn chặn các cuộc tấn công CSRF. Mã thông báo cần
là duy nhất cho mỗi phiên người dùng và phải có giá trị ngẫu nhiên lớn đối với
làm cho nó khó đoán. Một ứng dụng bảo mật CSRF chỉ định một
Mã thông báo CSRF cho mỗi phiên người dùng.
nó bảo vệ BE để đảm bảo rằng dữ liệu được đăng lên BE đến từ một biểu mẫu do BE tạo ra trừ khi bất kỳ ai cũng có thể đăng dữ liệu lên BE từ bất kỳ nguồn nào.
ví dụ: trong biểu mẫu đăng nhập, tin tặc có thể viết mã để thử một số kết hợp (tất nhiên drupal có chính sách thử lại tối đa để ngăn người dùng thử sai mật khẩu hơn 5 lần và có tính năng phát hiện lũ trong drupal để ngăn chặn tấn công vũ phu ). Tuy nhiên, các biểu mẫu không có bảo vệ CSRF là nơi tốt để bot và kẻ gửi thư rác đăng dữ liệu sang một bên nhiều lần.
Vì vậy, sẽ tốt hơn nếu các biểu mẫu của bạn được mở để ẩn danh bảo vệ chúng hũ mật ong và một giải pháp phát hiện con người ( captcha, Hình ảnh xác thực lại, Recaptcha 3 hình ảnh xác thực toán học, v.v.).
ngoài ra, có Mô-đun Bộ bảo mật làm cho nó an toàn hơn.
Cập nhật phần sau khi tôi nhận thấy nó đang xảy ra với người dùng đã đăng nhập
vì những lý do tôi đã đề cập ở trên, đặc biệt là để có các chức năng lưu trữ tốt hơn, đối với người dùng ẩn danh, nó không được làm mới.
Nhưng đối với người dùng đã đăng nhập sau khi kiểm tra cấp độ mã, tôi nhận ra đó không phải là lỗi.
nó được tạo dựa trên form_id và cho đến khi bạn chưa gửi biểu mẫu, nó sẽ giống như vậy và việc làm mới không tạo ra một biểu mẫu mới. Cho nên, form_token
và form_build_id
là những thứ bảo vệ hình thức khỏi.
để tham khảo và nhận được nhiều hơn hãy xem trên:
// Thêm mã thông báo, dựa trên #token hoặc form_id, vào bất kỳ biểu mẫu nào được hiển thị cho
// người dùng xác thực.Điều này đảm bảo rằng mọi biểu mẫu được gửi thực sự
// được người dùng yêu cầu trước đó và bảo vệ chống lại yêu cầu trang chéo
// giả mạo.
// Điều này không áp dụng cho các biểu mẫu được gửi theo chương trình. Hơn nữa,
// vì mã thông báo bị ràng buộc phiên và biểu mẫu hiển thị cho người dùng ẩn danh là
// rất có thể đã được lưu vào bộ đệm, chúng tôi không thể gán mã thông báo cho chúng.
// Trong quá trình cài đặt chưa có $user.
// Trình tạo biểu mẫu có thể đặt rõ ràng #token thành FALSE khi chéo trang
// yêu cầu giả mạo không liên quan đến biểu mẫu, chẳng hạn như biểu mẫu tìm kiếm.
nếu ($form_state
->isProgrammed() || isset($form['#token']) && $form['#token'] === FALSE) {
bỏ đặt($form['#token']);
}
khác {
$form['#cache']['contexts'][] = 'user.roles:authenticated';
nếu ($ người dùng && $ người dùng
->isAuthenticated()) {
// Tạo mã thông báo công khai và trình giữ chỗ dựa trên ID biểu mẫu.
$placeholder = 'form_token_placeholder_' . Mật mã::hashBase64($form_id);
$form['#token'] = $placeholder;
$form['form_token'] = [
'#id' => Html::getUniqueId('edit-' . $form_id . '-form-token'),
'#type' => 'mã thông báo',
'#default_value' => $placeholder,
// Quá trình xử lý và xác thực biểu mẫu yêu cầu giá trị này. Đảm bảo
// giá trị biểu mẫu đã gửi xuất hiện theo nghĩa đen, bất kể #tree tùy chỉnh
// và #parents được đặt ở nơi khác.
'#cha mẹ' => [
'form_token',
],
Thẩm quyền giải quyết : https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21FormBuilder.php/function/FormBuilder%3A%3AprepareForm/9.3.x