După cum spune definiția CSRF
Un jeton CSRF este un jeton aleatoriu securizat (de exemplu, jeton de sincronizare sau
jeton de provocare) care este utilizat pentru a preveni atacurile CSRF. Jetonul are nevoie
să fie unic pentru fiecare sesiune de utilizator și ar trebui să aibă o valoare mare aleatorie pentru
face dificil de ghicit. O aplicație securizată CSRF atribuie un unic
Token CSRF pentru fiecare sesiune de utilizator.
protejează BE pentru a fi sigur că mesajul postat în BE provine dintr-un formular generat de BE, cu excepția cazului în care cineva poate posta date în BE din orice sursă.
de exemplu, într-un formular de autentificare, un hacker ar putea scrie un cod pentru a încerca mai multe combinații (desigur, drupal are o politică de reîncercare maximă care împiedică utilizatorii să încerce parola greșită de mai mult de 5 ori și există detectarea inundațiilor în drupal care împiedică atacurile cu forță brută ). Dar totuși, formularele fără protecție CSRF sunt locuri bune pentru roboții și spammerii să posteze date în lateral de mai multe ori.
Deci, este mai bine dacă formularele dumneavoastră sunt deschise pentru a le proteja anonim borcan cu miere și o soluție de detectare umană (captcha, Recaptcha, Recaptcha 3 matematică captcha etc).
în plus, având Modul Kit de securitate face-l mai sigur.
Actualizați partea după ce am observat că se întâmplă pentru utilizatorii autentificați
din motivele pe care le-am menționat mai sus, în special pentru a avea funcționalități mai bune de stocare în cache, pentru un utilizator anonim, acesta nu este reîmprospătat.
Dar pentru utilizatorul conectat După câteva verificări la nivelul codului, îmi dau seama că nu este o eroare.
este generat pe baza form_id și până când nu ați trimis formularul va fi același, iar reîmprospătarea nu generează unul nou. Asa de, form_token
și form_build_id
sunt lucruri care protejează forma de.
pentru referință și pentru mai multe, aruncați o privire pe:
// Adăugați un token, bazat fie pe #token, fie pe form_id, la orice formular afișat
// utilizatori autentificați.Acest lucru asigură că orice formular trimis a fost efectiv
// solicitat anterior de utilizator și protejează împotriva solicitărilor încrucișate
// falsuri.
// Acest lucru nu se aplică formularelor trimise în mod programatic. În plus,
// deoarece tokenurile sunt legate de sesiune, iar formularele afișate utilizatorilor anonimi sunt
// foarte probabil cache, nu putem aloca un token pentru ei.
// În timpul instalării, nu există încă niciun utilizator $.
// Constructorii de formulare pot seta în mod explicit #token la FALSE când traversează site-ul
// solicitarea de fals este irelevantă pentru formular, cum ar fi formularele de căutare.
dacă ($form_state
-> este programat() || isset($form['#token']) && $form['#token'] === FALSE) {
unset($form['#token']);
}
else {
$form['#cache']['contexts'][] = 'user.roles:authenticated';
dacă ($utilizator && $utilizator
-> isAuthenticated()) {
// Generați un token public și un substituent pe baza ID-ului formularului.
$placeholder = 'form_token_placeholder_' . Criptă::hashBase64($form_id);
$form['#token'] = $substituent;
$form['form_token'] = [
'#id' => Html::getUniqueId('edit-' . $form_id . '-form-token'),
'#type' => 'jeton',
'#default_value' => $substituent,
// Procesarea și validarea formularelor necesită această valoare. Asigurați
// valoarea formularului trimis apare literal, indiferent de #arborele personalizat
// și #părinții fiind stabiliți în altă parte.
'#parinti' => [
'form_token',
],
Referinta: https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Form%21FormBuilder.php/function/FormBuilder%3A%3AprepareForm/9.3.x