itholoinfo.com.com

Cum să preveni atacurile CSRF în PHP

Un atac de forțare a solicitărilor de site încrucișat (CSRF) este un tip de vulnerabilitate a aplicației web unde victima execută din greșeală un script din browserul care profită de sesiunea pornită de la un anumit site. Rezolvarea atacurilor CSRF poate fi efectuată pe solicitări GET sau POST. Acest articol vă va arăta cum să ajutați la prevenirea atacurilor CSRF asupra unei aplicații web.

pași

Metoda 1
Prezentare generală a metodelor

Vom utiliza două metode pentru a preveni atacurile CSRF în cererile dvs. GET și POST.


Primul este să includeți un jeton aleator (segment de text sau simbol) în fiecare cerere, adică un șir unic generat pentru fiecare sesiune. Generăm tokenul și apoi îl includem în toate formele ca o intrare ascunsă. Astfel, sistemul va verifica dacă formularul este valid prin compararea tokenului cu cel stocat în variabila de sesiune a utilizatorului. Astfel, pentru ca o persoană răuvoitoare să genereze o solicitare, va trebui să știe valoarea simbolului.


A doua metodă este folosirea numelor aleatoare pentru fiecare câmp de formular. Valoarea aleatorie a numelui pentru fiecare câmp este stocată într-o variabilă sesiune, iar după ce este trimis formularul, sistemul generează o nouă valoare aleatorie. Aceasta înseamnă că pentru ca un atac să funcționeze, atacatorul va trebui să ghicească aceste nume aleatoare.


De exemplu, o solicitare care avea acest formular:

Acesta va arata astfel:

Metoda 2
Crearea fișierului csrf.class.php

Acesta este fișierul principal care va conține toate funcțiile utilizate pentru prevenirea atacurilor CSRF.

Imaginea intitulată 2543022 1
1
Creați csrf.class.php. Începeți prin a crea fișierul și salvați-l cu următorul conținut:

Toate codurile din această secțiune a ghidului vor fi adăugate la sfârșitul acestui fișier.
  • Imaginea intitulată 2543022 2
    2
    Creați funcția get_token_id ().
    Această funcție primește ID-ul token în sesiunea utilizatorilor, dacă unul nu este deja creat, apoi 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
    Creați funcția get_token ().
    Această funcție primește valoarea tokenului, dacă nu a fost deja generată, atunci generează una.

    funcția publică get_token () {if (isset ($ _ SESSION [ `token_value`])) {return $ _ SESSION [ `token_value`] -} else {$ jeton = Hash ( `SHA256`, $ this-> aleatoare (500)) - $ _ SESSION [ `token_value`] = jeton-return $ $}} token-
  • Imaginea intitulată 2543022 4
    4
    Creați funcția check_valid ().
    Această funcție este utilizată pentru a verifica dacă valoarea token și id-ul 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-} else {return}} else fals {return}} fals
  • Imaginea intitulată 2543022 5
    5
    Creați funcția form_names ().
    Aceasta este a doua apărare împotriva atacurilor CSRF în acest articol. Această funcție generează nume aleatoare pentru câmpurile de formular.

    public $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $ $% esteset ($ _SESSION [$ n])? $ _SESSION [$ n]: $ this-> random (10) - $ _SESSION [$ n] = $ s- $ valori [$ n] = $ s-} returnează valori $-}
  • Imaginea cu titlul 2543022 6
    6
    Creați funcția aleatoare ().
    Această funcție generează un șir aleator folosind fișierul aleator al linux pentru a avea mai multă entropie.

    private function aleatorii (len $) {if (function_exists ( `openssl_random_pseudo_bytes`)) {$ byteLen = intval (($ lumen / 2) +1) - $ = substr întoarce (BIN2HEX (openssl_random_pseudo_bytes ($ byteLen)), 0, $ len) -} elseif (@is_readable (/ dev / urandom `)) {$ f = fopen ( „/ dev / urandom`, `r`) - $ urandom = fread (f $, $ len) -fclose ($ f) - returnează $ = „-} if (gol (întoarcere $)) {for (i = $ $ i 0-<$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-dacă ($ rand> 90) $ rand + = 6-if ($ rand == 123) $ rand = 52-if ($ rand == 124) $ rand = 53- $ return. ($ rand) -}} retur $ return-}
  • 7
    Închideți clapa de clasă.
    Aceasta va încheia clasa csrf.

    }
    Acum puteți închide fișierul csrf.class.php așa cum am terminat editarea.
  • Metoda 3
    Protejarea paginilor cu csrf.class.php

    Următorii pași vă vor arăta cum să utilizați clasa CSRF pentru a preveni aceste atacuri.

    1. Imaginea intitulată 2543022 8
      1
      Protejarea unui formular POST.
      Codul de mai jos arată modul de implementare a clasei csrf pe un formular.

      get_token_id () - $ token_value = $ csrf-> get_token ($ TOKEN_ID) - // Generarea de nume aleatoare formă form_names $ = $ csrf-> form_names (array ( `utilizator`, `parola`), fals) -daca (isset ($ _POST [$ form_names [] `utilizator`], $ _POST [$ form_names [ `parola`]])) {// Verificați dacă valoarea id-ul și jetonul sunt válidos.if ($ csrf-> check_valid ( ` post `)) {// obține variabilele de formular $ utilizator = $ _POST [$ form_names [.` utilizator `]] - $ parola = $ _POST [$ form_names [` parola „]] - // funcția formularul va aici} // Re-crea o nouă valoare aleatoare pentru forma $ = $ form_names csrf-> form_names (array ( `utilizator`, `parola`), true) -.}>?
    Distribuiți pe rețelele sociale:

    înrudit
    Cum să hack un site webCum să hack un site web
    Cum de a crea o cerere de gazduire deschisa pe CouchsurfingCum de a crea o cerere de gazduire deschisa pe Couchsurfing
    Cum de a evita o injecție SQL în PHPCum de a evita o injecție SQL în PHP
    Cum de a ajuta pe cineva care are un atac de astmCum de a ajuta pe cineva care are un atac de astm
    Cum de a identifica simptomele atacului de inima la femeiCum de a identifica simptomele atacului de inima la femei
    Cum de a învinge Larxenul (Bătălia de date) în Hearts din Regatul Unit IICum de a învinge Larxenul (Bătălia de date) în Hearts din Regatul Unit II
    Cum să înfrângem cea de-a șaptea ciupercă în inimile regatului IICum să înfrângem cea de-a șaptea ciupercă în inimile regatului II
    Cum sa scapi de atacurile de panicaCum sa scapi de atacurile de panica
    Cum să utilizați hipnoza pentru tratarea atacurilor de anxietateCum să utilizați hipnoza pentru tratarea atacurilor de anxietate
    Cum să completați formularele de cerere de locuri de muncăCum să completați formularele de cerere de locuri de muncă
    » » Cum să preveni atacurile CSRF în PHP
    © 2021 itholoinfo.com.com