gtemata.com

Cum de a preveni atacurile de tip Forgery (CSRF) de la Cross Site în PHP

Un atac de cerere fals cross-site (CSRF) este un tip de vulnerabilități de aplicații web în cazul în care victima se execută din greșeală un script în browser-ul care utilizează sesiunea de conectare la un anumit site. Atacurile CSRF pot fi efectuate pe cereri GET sau POST. Acest articol vă va arăta cum să prevină atacurile CSRF pe aplicația Web.

paşi

Metoda 1

Descrierea metodelor

Vom folosi două metode pentru a evita atacurile CSRF pe cererile dvs. GET și POST.


Primul este să includă un jeton aleator cu fiecare cerere, care este un șir unic generat pentru fiecare sesiune. Generăm tokenul și apoi îl includem în fiecare modul ca o intrare ascunsă. Sistemul verifică dacă modulul este valid prin compararea tokenului cu cel stocat în variabila de sesiune a utilizatorilor. Aceasta înseamnă că un atacator, pentru a genera o solicitare, trebuie să cunoască valoarea simbolului.


A doua metodă este să utilizați numele aleatoriu pentru fiecare câmp din formular. Valoarea numelui aleatoriu pentru fiecare câmp este stocată într-o variabilă de sesiune și, după ce forma a fost prezentată, sistemul generează o nouă valoare aleatorie. Aceasta înseamnă că pentru ca un atac să funcționeze, atacatorul ar trebui să ghicească aceste nume aleatoare ale modulelor.


De exemplu, o solicitare care a apărut o dată astfel:

Imaginea intitulată Passwordscsrf.jpg

acum va arata astfel:

Imaginea intitulată Protectedrequestcsrf.jpg

Metoda 2

Creați fișierul csrf.class.php

Acesta este fișierul principal care conține toate funcțiile care vor fi utilizate pentru a preveni atacurile CSRF.

Imaginea intitulată 2543022 1
1
Creați csrf.class.php. Începeți prin crearea fișierului cu conținutul de bază și salvând-l:

Tot codul din această secțiune a ghidului va fi adăugat la sfârșitul acestui fișier.
  • Imaginea intitulată 2543022 2
    2
    Creează funcția get_token_id ().
    Această funcție ia ID-ul token din sesiunea de utilizator, dacă nu a fost deja creată, după care generează un jeton aleator.

    funcția publică get_token_id () {if (isset ($ _ SESSION [ `TOKEN_ID`])) {return $ _ SESSION [ `TOKEN_ID`] -} else {$ TOKEN_ID = $ this->aleatoare (10) - $ _ SESSION [`token_id`] = $ token_id-return $ token_id-}}
  • Imaginea intitulată 2543022 3
    3
    Creează funcția get_token ().
    Această funcție primește valoarea tokenului, dacă nu a fost deja creată, după care generează una.

    funcția publică obține jeton () {if (isset ($ _ SESSION [ `Token_value`])) {return $ _ SESSION [ `Token_value`] -} else {jeton = hash ( `SHA256` $, $ this->aleatoriu (500)) - $ _ SESSION [`token_value`] = $ token-return $ token-}}
  • Imaginea intitulată 2543022 4
    4


    Creează funcția check_valid () Function.
    Această funcție este utilizată pentru a verifica dacă id-ul token și valoarea token sunt valide. Aceasta face acest lucru verificând valorile solicitării GET sau POST cu valorile stocate în variabila de sesiune a utilizatorului.

    funcția publică check_valid (metoda $) {if ($ method == `post` || $ method == `get`) {$ post = $ _POST- $ get = $ _GET-if $ this->get_token_id ()]) && ($ {} $ Metoda [$ this->get_token_id ()] == $ this->get_token ())) {return true-} altceva {return false-}} altceva {return false-}}
  • Imaginea intitulată 2543022 5
    5
    Creează funcția form_names () Funcție.
    Aceasta este a doua apărare menționată în acest articol împotriva atacului CSRF. Această funcție generează nume aleatoare pentru câmpurile de formular.

    form_names funcției publice ($ nume, $ regenerate) {valori $ = array () - foreach ($ nume ca $ n) {if ($ regenera == true) {unset ($ _ SESSION [$ n]) -} $ s = isset ($ _ SESIUNE [$ n])? $ _SESSION [$ n]: $ acest->aleatoriu (10) - $ _ SESIUNE [$ n] = $ s- $ valori [$ n] = $ s-} retur $ valori-}
  • Imaginea cu titlul 2543022 6
    6
    Creează funcția aleatoare a funcției ().
    Această funcție generează un șir aleator folosind fișierul Linux Random pentru a crește entropia.

    private function aleatoare ($ len) {if (function_exists ( `openssl_random_pseudo_bytes`)) {$ byteLen = intval (($ len / 2) + 1) - $ returna = substr (BIN2HEX (openssl_random_pseudo_bytes ($ byteLen)), 0, $ len) -} elseif (@is_readable ( `/ dev / urandom`)) {$ f = fopen ( `/ dev / urandom`, `r`) - $ urandom = fread ($ f, $ len) -fclose ($ f) - întoarcerea = `` $ -} if (gol (întoarcere $)) {for (i = $ $ s 0-<$ Len - $ i ++) {if) {if ($ i% 2 == 0) {mt_srand (timp ()% 2147 + 1,000,000 * (dublu) microtime () * 1,000,000) (isset ($ urandom!) - } $ rand = 48 + mt_rand ()% 64-} else {$ rand = 48 + ord ($ urandom [$ i])% 64-} if ($ rand57) $ rand + = 7-if ($ rand90) $ rand + ($ Rand == 123) $ rand = 52-if ($ rand == 124) $ rand = 53- $ retur. = Chr ($ rand) -}} retur $ return-}
  • Imaginea intitulată 2543022 7
    7
    Închideți paranteza clasei.
    Aceasta va închide clasa csrf.

    }
    Acum puteți închide fișierul csrf.class.php deoarece am terminat de editat-o.
  • Metoda 3

    Protejați paginile cu csrf.class.php

    Acești pași vă vor arăta cum să utilizați clasa CSRF pentru a preveni atacurile CSRF.

    Imaginea intitulată 2543022 8
    1
    Protejați un formular POST.
    Următorul cod demonstrează modul de implementare a clasei csrf pe un formular.

    Distribuiți pe rețelele sociale:

    înrudit