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

Va arăta astfel:

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

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-}}

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-}}

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-}}

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-}

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-}

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

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) -}?>