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
Izgledaće ovako:
Korake
Ovo je glavna datoteka koja će sadržavati sve metode neophodne za sprečavanje napada CSRF-a.
Klasa CSRF {
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-}}
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-}}
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-}}
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-}
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-}
Ovo će završiti CSRF klasu.
}
Ovi koraci će vam pokazati kako koristiti CSRF klasu za zaštitu od napada CSRF-a.
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) -}?>