Ako chrániť pred útokmi pomocou požiadavky na prepojenie (csrf) v php
Útok pomocou intersite-montáž falošných (CSRF) je typ zraniteľnosti webovej aplikácie, keď je obeť neúmyselne spustená skript vo svojom prehliadači, ktorý používa aktuálne zasadnutie oprávneného používateľa na konkrétnom mieste. Útoky CSRR sa môžu uskutočniť prostredníctvom získavania alebo príspevkov. Tento článok vám ukáže, ako chrániť vašu webovú aplikáciu z útokov CSRF.
Metóda
Budeme používať dve metódy na ochranu pred útokmi CSRR na vaše požiadavky.
Prvou metódou je použitie náhodného kľúča. S každou požiadavkou je to jedinečná línia generovaná pre každú reláciu. Genergerujeme kľúč, a potom ho zapnite do každej formy vo forme skrytého poľa. Potom systém kontroluje platnosť formulára, porovnanie kľúčov a hodnoty uloženého v premennej relácie používateľa. To znamená, že ak chce útočník generovať žiadosť, bude musieť poznať kľúčovú hodnotu.
Druhou metódou je použitie náhodných mien pre každé pole formulárov. Hodnota náhodného mena pre každú oblasť je uložená v premennej relácie a po odoslaní formulára (sabmitický vyskytol) systém vygeneruje nové názvy náhodných polí. To znamená, že ak chce útočník urobiť útok, bude musieť poznať tieto náhodné názvy polí formulára.
Napríklad žiadosť, ktorá sa zdá, že sa to zdá

Bude to vyzerať takto:

Kroky
Toto je hlavný súbor, ktorý bude obsahovať všetky metódy potrebné na zabránenie útokom CSRF.
Trieda CSRF {

Táto funkcia prijíma ID kľúčov (token) z premennej relácie, ak ešte nebol vytvorený, generuje náhodný token.
Verejná funkcia Get_Token_id () {If (Isset ($ _ Session [`Token_ID`])) {Return $ _SESSION [`TOKEN_ID`] -} iní {$ token_id = $ This-> Random (10) - $ _ Session [` token_id `] = $ token_id-return $ token_id-}}

Táto funkcia prijíma hodnotu tokenu, ak hodnota ešte nebola generovaná, potom sa vytvára.
Verejná funkcia Get_Token () {If (Isset ($ _ Session [`Token_Value`]) {return_value `] {` token_value `] -} else {$ token = hash (` SHA256 `, $ This-> Random (500)) - $ _ relácia [`token_value`] = $ toten-return $ token-}}}

Táto funkcia kontroluje platnosť ID a token. Kontrola nastane porovnaním získaných hodnôt, keď sa získajú alebo pošlite dotazy s hodnotami premennej relácie používateľa.
Verejná funkcia Check_Valid ($ metóda) {If ($ Method == `Post` || $ Metóda == `Získajte`) {$ Post = $ _Post- $ Get = $ _GET-IF (ISSET ($ {$ {$ Metóda} $ This-> Get_TOOL_ID ()]) && ($ {$ Metóda} [$ This-> Get_Token_id ()] == $ This-> Get_TOOL ())) {Return True-} Else {RETURN FALSE-}}}} Návrat false-}}

Toto je druhá ochrana proti útokom CSRR opísaným v tomto článku. Táto funkcia generuje náhodné názvy pre polia formulára.
Verejná funkcia Form_names ($ Názvy, $ Regenerované) {$ Hodnoty = Array () - Foreach ($ Regeneration == TRUE) {Unset ($ _ Session [$ n]) -} $ S = ISSET ($ _ Session [$ n]) ? $ _SESSION [$ n]: $ Toto-> Random (10) - $ _ Session [$ n] = $ S-$ Hodnoty [$ n] = $ S-} Return $ Hodnoty-}

Táto funkcia generuje náhodný reťazec pomocou náhodného Linuxu FAL pre väčšiu chaotickú hodnotu hodnôt.
Súkromné funkcie Náhodné ($ LEN) {Function_exists (`OPENSSL_RANDOM_SEUDO_BYTES`)) {$ BYTELEN = INTVAL (($ LEN / 2) + 1) - $ Return = Substr (bin2hex (openssl_random_peneudo_Beetes ($ Byten)), 0, $ LEN) -} eirme (@is_Readable (`/ Dev / Urandom`)) {$ F = FOPEN (`/ Dev / Urandom`, `R`) - $ URANDOM = FREAD ($ F, $ LEN) -Fclose ($ F) - $ return = `` -} Ak (prázdny ($ return)) {pre ($ 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 Return.= CHR ($ RAND) -}} Návrat $ Return-}

Toto dokončí triedu CSRF.
}
Tieto kroky vám ukážu, ako používať triedu CSRF na ochranu pred útokmi CSRR.

Nižšie uvedený kód zobrazuje použitie triedy CSRR pre formulár.
session_start () - zahŕňajú `CSRF.Trieda.PHP `- $ CSRF = NOVÉ CSRF () - // Generation ID a Tocken Hodnota $ TOKEN_ID = $ CSRF-> GET_TOOL_ID () - $ TOKEN_VALUE = $ CSRF-> GET_TOOL ($ TOKEN_ID) - // Generovanie náhodných mien pre formulár Polia $ form_names = $ CSRF-> Form_names (pole (`User`, `Heslo`), FALSE) -Ak (ISSET ($ _ Post [$ Form_names [`User`]], $ _POST [$ FORMER_NAGE [` ]])) {// Skontrolujte, či sú platné ID a token hodnoty.Ak ($ CSRF-> Check_Valid (`Post`)) {// Získať variabilné formuláre.$ user = $ _Post [$ form_names [`user`]] - $ password = $ _Post [$ form_names [`Heslo`]] - // Metóda lisovania tu} // Generovať novú náhodnú hodnotu pre formulár.$ form_names = $ csrf-> form_names (pole (`užívateľ`, heslo `), true) -}?>