Kako zaštititi od napada pomoću zahtjeva za ugradnju interte (csrf) u php-u

Napad pomoću lažnog inseta (CSRF) je vrsta ranjivosti web aplikacije kada žrtva nenamjerno lansira skriptu u svom pretraživaču, koji koristi trenutnu sesiju ovlaštenog korisnika na određenoj web lokaciji. Napadi CSRF-a mogu se izvršiti putem zahtjeva za dobivanje ili posta. Ovaj članak će vam pokazati kako zaštititi vašu web aplikaciju iz napada CSRF-a.

Metoda

Upotrijebit ćemo dvije metode za zaštitu od CSRF napada vašeg zahtjeva za dobivanje i posta.

Prva metoda je korištenje slučajnog ključa. Uz svaki zahtjev, ovo je jedinstvena linija generirana za svaku sesiju. Stvaramo ključ, a zatim ga uključite na svaki obrazac u obliku skrivenog polja. Dalje, sustav provjerava valjanost obrasca, uspoređujući tipku i vrijednost pohranjenu u promjenjivi korisnika korisnika. To jest, ako napadač želi generirati zahtjev, morat će znati ključnu vrijednost.

Druga metoda je upotreba nasumičnih imena za svako polje obrasca. Vrijednost nasumičnog naziva za svako polje pohranjuje se u varijabli za sesiju i nakon slanja obrasca (dogodi se sabmitska), sustav generira nova nasumična imena polja. To jest, ako napadač želi napeti napad, morat će znati ova slučajna imena polja obrasca.

Na primjer, zahtjev koji se činio ovako

Image Nazvan Passwordscsrf.jpg

Izgledaće ovako:

Slika pod nazivom ProtectioCedRequestcsrf.jpg

Korake

Metoda 1 od 2:
Stvaranje CSRF datoteke.Klasa.PHP

Ovo je glavna datoteka koja će sadržavati sve metode neophodne za sprečavanje napada CSRF-a.

  1. Slika pod nazivom 2543022 1
jedan. Kreirajte CSRF datoteku.Klasa.PHP.Započnite kreiranjem datoteke i sačuvajte ga sa sljedećim sadržajem:

Klasa CSRF {
Svi kod u ovom dijelu priručnika bit će dodan na kraju ove datoteke.
  • Slika pod nazivom 2543022 2
    2. Stvorite metodu get_token_id ().
    Ova značajka prima ličnu kartu (token) iz varijable sesije, ako još nije stvorena, generira slučajni token.

    Javna funkcija get_token_id () {if (if (bitna ("token_id"])) {povratak $ _Session [`token_id`] -} inače {$ token_id = $ this-> $ _ session [` token_id `] = $ token_id-return $ token_id-}}
  • Slika pod nazivom 2543022 3
    3. Kreirajte metodu get_token ().
    Ova značajka prima vrijednost tokena ako vrijednost još nije generirana, onda se generira.

    Javna funkcija get_token () {if (ist ($ _ sesija `]) {return_value`] {`token_value`] -} Else {$ token = hash (`sha256`, $ this-> slučajni (500)) - $ _ sesija [`token_value`] = $ token-vratiti $ token-}}
  • Slika pod nazivom 2543022 4
    4. Kreirajte metodu Check_valid ().
    Ova funkcija provjerava na ID validnosti i token. Provjera događaju se uspoređivanjem dobivenih vrijednosti kada dobijete ili postavite upite s vrijednostima promjenjive sesije korisnika.

    Javna funkcija provjera_valid ($ metoda) {if ($ metoda == `post` || $ metod == `get`) {$ post = $ _Post- $ get = $ _get-ako (Isset ($ [$ metoda} [ $ this-> get_token_id ()]) && ($ {$ metoda} [$ this-> get_token_id ()] == $ this-> get_token ())) {povratak true-}} else { Povratak False-}}
  • Slika pod nazivom 2543022 5
    pet. Kreirajte metodu forme_names ().
    Ovo je druga zaštita od napada CSRF-a opisanih u ovom članku. Ova značajka stvara nasumična imena za polja obrasca.

    Javna funkcija ($ Imena, $ Regeneriraj) {$ vrijednosti = niz () - foreach ($ imena kao $ n) {if ($ regenerirati == istina) {inset ($ _ sesija [$ n]) -} $ S = Isset ($ _ sesija [$ N]) ? $ _Session [$ N]: $ this-> slučajni (10) - $ _ sesija [$ n] = $ S-$ Vrijednosti [$ n] = $ S-} Povratak $ vrijednosti-}
  • Slika pod nazivom 2543022 6
    6. Stvoriti slučajnu () metodu.
    Ova značajka generira nasumični niz koristeći nasumični Linux Fal za veću haotičnu vrijednost vrijednosti.

    Privatna funkcija Random ($ LEN) {Function_exists_seudo_bytes `)) {$ bytelen = intval (($ LEN / 2) + 1) - $ povratak = podzor (bin2hex (OpensSl_random_peneudo_byetes ($ byten)), 0, $ LEN) -} Elseif (@is_reableable (`/ dev / urandom`)) {$ f = fopen (`/ dev / urandom`, `r`) - $ urandom = fread ($ f, $ len) -fclose ($ f) - $ povratak = `` -} ako (prazan ($ povratak)) {za ($ 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-ako ($ rand> 90) $ rand + = 6-ako ($ rand ($ rand == 123) $ rand = 52-ako ($ rand == 124) $ rand = 53- $ povratak.= Chr ($ rand) -}} Povratak $ povratak-}
  • Slika pod nazivom 2543022 7
    7. Završite grak za zatvaranje klase.
    Ovo će završiti CSRF klasu.

    }
    Sada možete zatvoriti CSRF datoteku.Klasa.PHP otkad smo završili s njim.
  • Metoda 2 od 2:
    Zaštita stranice sa CSRF-om.Klasa.PHP

    Ovi koraci će vam pokazati kako koristiti CSRF klasu za zaštitu od napada CSRF-a.

    Slika pod nazivom 2543022 8
    jedan. Obrazac za odbranu pošte.
    Naziv ispod prikazuje upotrebu CSRF klase za obrazac.

    session_start () - uključuju "CSRF.Klasa.PHP `- $ CSRF = novi CSRF () - // vrijednost generacije i tocken vrijednost $ token_id = $ csrf-> get_token_id () - $ token_value = $ csrf-> get_token ($ token_id) - // Generiranje nasumičnih imena za obrazac polja $ forl_names = $ CSRF-> Obrazac_names (Array ("Korisnik", `lozinka`), lažno) -if (ako ($ _ post [$ form `)], $ _POST [$ form_names [` lozinka ` ]])) {// Provjerite da li su važeća vrijednost ID-a i tokena.ako ($ CSRF-> Check_valid (`post`)) {// dobiti promjenjive oblike.$ korisnik = $ _POST [$ form_names [`korisnik`]] - $ lozinka = $ _POST [$ form_names [`lozinka`]] - // Metoda lijevanja ide ovdje} // generiraju novu slučajnu vrijednost za obrazac.$ Form_names = $ CSRF-> Obrazac_names (Array ("korisnik", `lozinka`), true) -}?>
    Slične publikacije