Как говорится в определении CSRF
Токен CSRF — это защищенный случайный токен (например, токен синхронизатора или
токен вызова), который используется для предотвращения атак CSRF. Токен нужен
быть уникальным для сеанса пользователя и иметь большое случайное значение для
затруднить угадывание. Защищенное приложение CSRF назначает уникальный
Токен CSRF для каждого сеанса пользователя.
он защищает BE, чтобы быть уверенным, что отправленное в BE сообщение поступает из формы, созданной BE, если только кто-либо не может отправить данные в BE из любого источника.
например, в форме входа хакер может написать код, чтобы попробовать несколько комбинаций (конечно, в drupal есть политика максимального количества повторных попыток, которая не позволяет пользователям вводить неправильный пароль более 5 раз, и в drupal есть обнаружение флуда, которое предотвращает атаку грубой силы ). Но тем не менее, формы без CSRF-защиты — хорошее место для ботов и спамеров, чтобы несколько раз размещать данные на стороне.
Так что лучше, если ваши формы открыты для анонимности, защитите их. горшок меда и решение для обнаружения человека (капча, Рекапча, Recaptcha 3, математическая капча и т. д.).
дополнительно, имея Модуль комплекта безопасности сделать его более безопасным.
Обновить часть после того, как я заметил, что это происходит для зарегистрированных пользователей
по причинам, которые я упомянул выше, в частности, для улучшения функций кэширования, для анонимного пользователя он не обновляется.
Но для зарегистрированного пользователя после некоторой проверки уровня кода я понял, что это не ошибка.
он генерируется на основе form_id, и пока вы не отправите форму, она будет такой же, а обновление не создаст новую. Так, form_token
и form_build_id
вещи, которые защищают форму от.
для справки и получить больше взглянуть на:
// Добавляем токен на основе #token или form_id в любую форму, отображаемую для
// аутентифицированные пользователи.Это гарантирует, что любая отправленная форма действительно
// запрошенный ранее пользователем и защищает от межсайтового запроса
// подделки.
// Это не относится к формам, отправленным программно. Более того,
// так как токены привязаны к сеансу, а формы, отображаемые анонимным пользователям,
// скорее всего кэшированные, мы не можем назначить им токен.
// Во время установки еще нет $user.
// Конструкторы форм могут явно установить для #token значение FALSE при переходе на другой сайт.
// подделка запроса не имеет отношения к форме, такой как формы поиска.
если ($form_state
->запрограммировано() || isset($form['#token']) && $form['#token'] === FALSE) {
сбросить ($ форма ['# токен']);
}
еще {
$form['#cache']['contexts'][] = 'user.roles:authenticated';
если ($пользователь && $пользователь
->аутентифицировано()) {
// Генерируем общедоступный токен и заполнитель на основе идентификатора формы.
$placeholder = 'form_token_placeholder_' . Crypt::hashBase64($form_id);
$form['#токен'] = $заполнитель;
$ форма ['form_token'] = [
'#id' => Html::getUniqueId('edit-' . $form_id . '-form-token'),
'#type' => 'токен',
'#default_value' => $заполнитель,
// Для обработки и проверки формы требуется это значение. Обеспечьте
// отправленное значение формы отображается буквально, независимо от пользовательского #tree
// и #parents устанавливаются в другом месте.
'#родители' => [
'форма_токен',
],
Справка : https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21FormBuilder.php/function/FormBuilder%3A%3AprepareForm/9.3.x