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á

Obrázok s názvom Passwordscsrf.jpg

Bude to vyzerať takto:

Obrázok s názvom ProtectionRequestcsrf.jpg

Kroky

Metóda 1 z 2:
Vytvorenie súboru CSRR.Trieda.php

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

  1. Obrázok s názvom 2543022 1
jeden. Vytvorte súbor CSRF.Trieda.php.Začnite vytváraním súboru a uložte ho pomocou nasledujúceho obsahu:

Trieda CSRF {
Všetok kód v tejto časti príručky sa pridá na konci tohto súboru.
  • Obrázok s názvom 2543022 2
    2. Vytvorte metódu Get_TOOL_ID ().
    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-}}
  • Obrázok s názvom 2543022 3
    3. Vytvorte metódu get_tokoken ().
    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-}}}
  • Obrázok s názvom 2543022 4
    4. Vytvorte metódu check_valid ().
    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-}}
  • Obrázok s názvom 2543022 5
    päť. Vytvorte metódu Form_names ().
    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-}
  • Obrázok s názvom 2543022 6
    6. Vytvoriť náhodnú () metódu.
    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-}
  • Obrázok s názvom 2543022 7
    7. Dokončiť držiak zatvárania triedy.
    Toto dokončí triedu CSRF.

    }
    Teraz môžete zatvoriť súbor CSRR.Trieda.PHP, pretože sme s ním skončili.
  • Metóda 2 z 2:
    Ochrana stránok s CSRR.Trieda.php

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

    Obrázok s názvom 2543022 8
    jeden. Formulár post obrany.
    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) -}?>
    Podobné publikácie