Puncte:1

reîmprospătați form_token cu pagina de reîmprospătare

drapel ru

Din păcate, form_token-ul nu se modifică atunci când reîmprospătesc paginile formularului. Nu provoacă acest lucru abuz și riscuri de securitate? Poate cineva să explice ce face Drupal pentru CSRF în toate formele sale? Mulțumiri

Puncte:3
drapel cg

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

drapel ru
Mulțumesc dragă @Yuseferi. Dar întrebarea mea este de ce simbolul nu se schimbă pe pagina de reîmprospătare și este aceasta o eroare Drupal? Sau Drupal controlează CSRF cu alte metode, cum ar fi utilizarea cookie-urilor sau alte metode comune
Yuseferi avatar
drapel cg
@reza Cred că nu este o eroare. deoarece adăugarea CSRF la toate formele anonime provoacă unele probleme cu stocarea în cache. și nu generează în mod intenționat CSRF pentru formele anonime. desigur, există câteva module cookie de sesiune pentru a păstra evidența utilizatorului, dar nu se angajează în trimiterea formularelor, iar trimiterea formularelor poate fi imitată cu ușurință printr-un script. Acesta este motivul pentru care se confruntă de obicei cu o mulțime de spam pe formulare anonime.
drapel ru
Nu mă refer la un utilizator anonim.Din câte știu, CSRF este valabil pentru utilizatorii autentificați și această metodă a fost creată pentru a preveni trimiterea neautorizată
Yuseferi avatar
drapel cg
Raspunsul @reza a fost actualizat
Puncte:2
drapel id

Tokenul anti-CSRF al Drupal funcționează prin combinarea informațiilor care sunt secrete pentru site, acțiune și utilizator individual într-o valoare hashing trimisă în HTML-ul paginii.

Din https://www.drupal.org/node/2319205

leymannx avatar
drapel ne
„și utilizatorul individual”. Este o chestie bazată pe sesiune. De aceea, nu se schimbă doar la spălarea cache-ului.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.