Cum să protejați împotriva atacurilor utilizând o cerere de instalare intersite (csrf) în php

Atacul care utilizează un fals fals (CSRF) este un tip de vulnerabilitate a aplicației web atunci când victima lansează neintenționat scriptul din browserul său, care utilizează sesiunea curentă a utilizatorului autorizat într-un anumit site. Atacurile CSRF pot fi făcute prin cereri de obținere sau post. Acest articol vă va arăta cum să vă protejați aplicația web de atacurile CSRF.

Metodă

Vom folosi două metode pentru a proteja împotriva atacurilor CSRF ale solicitărilor dvs. de primire și post.

Prima metodă este de a utiliza o cheie aleatorie. Cu fiecare cerere, aceasta este o linie unică generată pentru fiecare sesiune. Noi generăm cheia și apoi o transformăm la fiecare formă sub forma unui câmp ascuns. Apoi, sistemul verifică validitatea formularului, comparând cheia și valoarea stocată în variabila de sesiune a utilizatorului. Adică dacă atacatorul dorește să genereze o cerere, va trebui să cunoască valoarea cheie.

A doua metodă este utilizarea de nume aleatoare pentru fiecare câmp de formular. Valoarea unui nume aleatorie pentru fiecare câmp este stocată în variabila sesiunii și după trimiterea formularului (sabmitic a avut loc), sistemul generează noi nume ale câmpurilor aleatorii. Adică dacă atacatorul dorește să facă un atac, va trebui să cunoască aceste nume aleatoriu ale câmpurilor de formular.

De exemplu, cererea care a făcut-o așa

Imagine intitulată partyscsrf.jpg

Va arăta astfel:

Imagine intitulată ProtectedRequestCsrf.jpg

Pași

Metoda 1 din 2:
Crearea unui fișier CSRF.Clasă.PHP

Acesta este fișierul principal care va conține toate metodele necesare pentru a preveni atacurile CSRF.

  1. Imagine intitulată 2543022 1
unu. Creați un fișier CSRF.Clasă.PHP.Începeți prin crearea unui fișier și salvați-o cu următorul cuprins:

Clasa csrf {
Toate codurile din această secțiune a manualului va fi adăugată la sfârșitul acestui fișier.
  • Imagine intitulată 2543022 2
    2. Creați o metodă Get_Token_ID ().
    Această caracteristică primește un ID cheie (token) din variabila sesiunii, dacă nu a fost încă creat, generează un jeton aleatoriu.

    Funcția publică Get_Token_id () {IF (ISET ($ _ sesiune [`token_id`])) {return $ _session [`token_id`] -} altceva {$ token_id = $ Acest-> Random (10) - $ _ sesiune [` token_id `] = $ token_id-return $ token_id-}}
  • Imagine intitulată 2543022 3
    3. Creați o metodă Get_Token ().
    Această caracteristică primește o valoare token, dacă valoarea nu a fost încă generată, atunci este generată.

    Funcția publică Get_Token () {IF (ISSET (sesiune de $ _ [Token_Value "] {retur_value `] {" token_value`] -} altceva {$ token = hash (`Shapa256`, $ acest-> aleator (500)) - $ _ sesiune [`token_value`] = $ token-return $ token-}}
  • Imagine intitulată 2543022 4
    4. Creați o metodă de verificare () ().
    Această caracteristică verifică valabilitatea și tokenul id. Verificarea are loc prin compararea valorilor obținute la obținerea sau postarea interogărilor cu valorile variabilei sesiunii utilizatorului.

    Funcția publică Check_valid ($ metoda) {if ($ metoda == `post` || $ metoda == "get") {$ post = $ _post- $ get = $ _Get-IF (Isset ($ {$ metoda} $ this-> get_token_id ()]) && ($ {$ metoda} [$ this-> get_t_token_id ()] == $ this-> get_token ())) {return true-} altceva {retur fals-}} Returnați false-}}
  • Imagine intitulată 2543022 5
    cinci. Creați metoda FORM_NAMES ().
    Aceasta este a doua protecție împotriva atacurilor CSRF descrise în acest articol. Această caracteristică generează nume aleatorii pentru câmpurile de formular.

    Funcția publică Form_names ($ nume, $ regenerate) {$ valori = matrice ($ n) {dacă ($ regenerate == adevărat) {Unset ($ _ sesiune [$ n]) -} $ s = izset ($ _ sesiune [$ n]) ? $ _Session [$ n]: $ this-> Random (10) - $ _ sesiune [$ n] = $ s- valori [$ n] = $ s-} returnare $ valori-}
  • Imagine intitulată 2543022 6
    6. Creați o metodă aleatorie ().
    Această caracteristică generează un șir aleator folosind un FAL aleatoriu Linux pentru o valoare mai mare haotică a valorilor.

    Funcție privată aleatorie ($ len) {funcții_exists (`openssl_random_seudo_bytes`)) {$ bytenth = Intval (($ len / 2) + 1) - $ retur = substr (bin2hex (openssl_random_peneudo_byetes ($ byten)), 0, $ len) -} altcinef (@is_reableble (`/ Dev / Urandom`)) {$ F = Fopen (`/ Dev / Urandom`, `R`) - $ Urandom = Fread ($ F, $ len) -fclose ($ F) - $ retur = `` -} dacă (gol ($ retur)) {pentru ($ i = 0- $ i<$len-++$i) {if (!isset($urandom)) {if ($i%2==0) {mt_srand(time()%2147 * 1000000 + (double)microtime() * 1000000)-}$rand=48+mt_rand()%64-} else {$rand=48+ord($urandom[$i])%64-}if ($rand>57) $ RAND + = 7-IF ($ RAND> 90) $ RAND + = 6-IF ($ RAND == 123) $ RAND = 52-IF ($ RAND == 124) $ RAND = 53- $ RETURN.= CHR ($ rand) -}}} returnare $ return-}
  • Imagine intitulată 2543022 7
    7. Finalizați consola de închidere a clasei.
    Aceasta va completa clasa CSRF.

    }
    Acum puteți închide fișierul CSRF.Clasă.PHP de când am terminat cu el.
  • Metoda 2 din 2:
    Protecția paginii cu CSRF.Clasă.PHP

    Acești pași vă vor arăta cum să utilizați clasa CSRF pentru a proteja împotriva atacurilor CSRF.

    Imagine intitulată 2543022 8
    unu. Forma de apărare post-apărare.
    Codul de mai jos prezintă utilizarea clasei CSRF pentru formular.

    session_start () - include "CSRF.Clasă.PHP `- $ CSRF = Noua CSRF () - // Generation ID și valoarea Tocken $ Token_id = $ csrf-> get_token_id () - $ token_value = $ CSRF-> Get_TOKEN ($ TOKEN_ID) - // Generarea de nume aleatorii pentru formular Domenii $ Form_names = $ CSRF-> Form_names (matrice ("utilizator", "parolă"), false) -af ($ _ Post [$ Form_names ["Utilizator"]], $ _post [$ Form_names [`parola " ]]]) {// Verificați dacă este valabilă ID-ul și valoarea tokenului.Dacă ($ csrf-> check_valid (`post`)) {// obține forme variabile.$ Utilizator = $ _post [$ Form_names [`user`]] - $ parola = $ _post [$ form_names [`parola`]] - Metoda de turnare merge aici} // Generați o nouă valoare aleatorie pentru formular.$ Form_names = $ CSRF-> Form_names (matrice ("Utilizator", "parolă"), TRUE) -}?>
    Publicații similare