Sådan forhindrer du CSRF-angreb i PHP

Et angreb på tværs af webstedsforespørgsler (CSRF) er en form for websøgningssårbarhed, hvor offeret utilsigtet kører et script i browseren, der udnytter den session, der startes på et bestemt websted. CSRF-angreb kan udføres på GET- eller POST-anmodninger. Denne artikel viser dig, hvordan du kan forhindre CSRF-angreb på en webapplikation.

trin

Metode 1
Oversigt over metoder

Vi bruger to metoder til at forhindre CSRF-angreb i dine GET- og POST-anmodninger.


Den første er at inkludere et tilfældigt token (tekstsegment eller symbol) i hver anmodning, det vil sige en unik streng, der genereres for hver session. Vi genererer token og indbefatter det i alle former som en skjult indgang. Således vil systemet verificere, at formularen er gyldig ved at sammenligne token med den, der er gemt i brugerens session variabel. På den måde vil en skadelig person til at fremsætte en anmodning være nødt til at kende værdien af ​​symbolet.


Den anden metode er at bruge tilfældige navne til hvert formularfelt. Den tilfældige navneværdi for hvert felt gemmes i en session variabel, og efter at formularen er indsendt, genererer systemet en ny tilfældig værdi. Dette betyder, at angriberen skal gætte disse tilfældige form navne til angreb på arbejde.


For eksempel en forespørgsel, der havde denne formular:

Det vil se sådan ud:

Metode 2
Oprettelse af csrf.class.php filen

Dette er hovedfilen, der indeholder alle de funktioner, der bruges til at forhindre CSRF-angreb.

Billede betegnet 2543022 1
1
Opret csrf.class.php. Start med at oprette filen og gemme den med følgende indhold:

Alle kode i dette afsnit af guiden vil blive tilføjet i slutningen af ​​denne fil.
  • Billede betegnet 2543022 2
    2
    Opret funktionen get_token_id ().
    Denne funktion får token-id`et i brugerens session, hvis en ikke allerede er oprettet, så genererer et tilfældigt token.

    offentlig funktion get_token_id () {if (isset ($ _ SESSION [ `TOKEN_ID`])) {return $ _ SESSION [ `TOKEN_ID`] -} else {$ TOKEN_ID = $ this-> Tilfældig (10) - $ _ SESSION [ `TOKEN_ID` ] = $ token_id-return $ token_id-}}
  • Billede betegnet 2543022 3
    3
    Opret get_token () -funktionen.
    Denne funktion får værdien af ​​symbolet, hvis den ikke allerede er genereret, så genererer den en.

    offentlig funktion get_token () {if (isset ($ _ SESSION [ `token_value`])) {return $ _ SESSION [ `token_value`] -} else {$ token = Hash ( `SHA256`, $ this-> random (500)) - $ _ SESSION [`token_value`] = $ token-return $ token-}}
  • Billede betegnet 2543022 4
    4
    Opret funktionen check_valid ().
    Denne funktion bruges til at verificere, at tokenværdien og id er gyldige. Det gør det ved at kontrollere værdierne for GET- eller POST-anmodningen med de værdier, der er gemt i brugersessionens variabel.



    offentlig funktion check_valid ($ metode) {hvis ($ metode == `post` || $ metode == `få`) {$ post = $ _POST- $ get = $ _GET-if (isset ($ {method} $ this-> get_token_id ()]) ($ {$ method} [$ this-> get_token_id ()] == $ this-> get_token ()) {return true-} ellers {return false-}} else {return false-}}
  • Billede betegnet 2543022 5
    5
    Opret funktionen form_names ().
    Dette er det andet forsvar mod CSRF-angreb i denne artikel. Denne funktion genererer tilfældige navne til formularfelterne.

    offentlig funktion form_names ($ navne, $ regenerere) {$ værdier = Array () - foreach ($ navne på $ n) {if ($ regenerere == true) {frakoblet ($ _ SESSION [$ n]) -} $ s = isset ($ _SESSION [$ n])? $ _SESSION [$ n]: $ this-> random (10) - $ _ SESSION [$ n] = $ s- $ værdier [$ n] = $ s-} returner $ værdier-}
  • Billede betegnet 2543022 6
    6
    Opret tilfældig () -funktionen.
    Denne funktion genererer en tilfældig streng ved hjælp af den tilfældige fil af linux for at få mere entropi.

    private funktion tilfældige (len $) {if (function_exists ( `openssl_random_pseudo_bytes`)) {$ byteLen = intval (($ lumen / 2) + 1) - $ returnere = substr (BIN2HEX (openssl_random_pseudo_bytes ($ byteLen)), 0, $ len) -} elseif (@is_readable (/ dev / urandom `)) {$ f = fopen ( "/ dev / urandom`, `r`) - $ urandom = fread (f $, $ len) -fclose ($ f) - $ return = `` -} hvis (tomt ($ return)) {for ($ 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-hvis ($ rand == 124) $ rand = 53- $ return. ($ rand) -}} returnér $ return)
  • 7
    Luk klasse beslag.
    Dette vil opsige csrf-klassen.

    }
    Du kan nu lukke csrf.class.php filen, da vi er færdige med at redigere det.
  • Metode 3
    Beskyttelse af sider Med csrf.class.php

    De følgende trin viser dig, hvordan du bruger CSRF-klassen til at forhindre disse angreb.

    1. Billede betegnet 2543022 8
      1
      Beskyttelse af en POST-formular.
      Koden nedenfor viser, hvordan du implementerer csrf-klassen på en formular.

      get_token_id () - $ token_value = $ csrf-> get_token ($ TOKEN_ID) - // Generer tilfældige danner navne form_names $ = $ csrf-> form_names (array ( `bruger`, `password`), falsk) -hvis (isset ($ _POST [$ form_names [ `bruger`]], $ _POST [$ form_names [ `password`]])) {// Tjek om værdien af ​​id og token er válidos.if ($ csrf-> check_valid ( ` $ form = $ _POST [$ form_names [`password`]] - // Funktionen af ​​formularen går her} // Genskab en ny tilfældig værdi for $ formularen = $ form_names csrf-> form_names (array ( `bruger`, `password`), true) -.}>?
    Del på sociale netværk:

    Relaterede
    © 2024 HodTari.com