Denne wikiHow lærer dig, hvordan du forhindrer en CSRF-angreb på et PHP-webprogram ved at inkludere et tilfældigt token med hver anmodning eller ved at bruge et tilfældigt navn for hvert formularfelt. Et CSRF-angreb på tværs af webstedet udnytter en sårbarhed i forbindelse med webapplikationer, hvor offeret utilsigtet kører et script i deres browser, der udnytter deres indloggesession til et bestemt websted. CSRF-angreb kan udføres over GET- eller POST-anmodninger.

Første del af fem:
Oversigt over metoder

Vi bruger to metoder til at forhindre CSRF-angreb på dine GET- og POST-anmodninger:

  1. 1 Inkluderet et tilfældigt token med hver anmodning. Dette er en unik streng, der genereres for hver session. Vi genererer token og derefter medtage det i enhver form som et skjult input. Systemet kontrollerer derefter, om formularen er gyldig ved at sammenligne token med den, der er gemt i brugerens session variabel. En angriber kan ikke generere en forespørgsel uden at kende tokenværdien.
  2. 2 Brug et tilfældigt navn for hvert formularfelt. Værdien af ​​det tilfældige navn for hvert felt gemmes i en session variabel. Når formularen er indsendt, genererer systemet en ny tilfældig værdi. For at være vellykket skal en angriber gætte disse tilfældige form navne.
    • For eksempel en anmodning, der en gang så så ud:
    • Vil nu se sådan ud:

Del to af fem:
Oprettelse af CSRF-klassefilen

  1. 1 skab csrf.class.php. Dette er filen, der indeholder alle de funktioner, der bruges til at forhindre CSRF-angreb.
     <? Php klasse CSRF  
  2. 2 Gem filen.
    • Alle kode i del 2 og 3 vil blive tilføjet i slutningen af ​​denne fil.

Del tre af fem:
Tilføjelse af et tilfældigt Token

  1. 1 Opret get_token_id () fungere. Denne funktion henter symbolet ID fra en brugers session, og hvis man ikke allerede er oprettet, genereres et tilfældigt token.
     offentlig fungere get_token_id()  hvis(isset($ _SESSION['TOKEN_ID']))  Vend tilbage $ _SESSION['TOKEN_ID'];  andet  $ TOKEN_ID = $ dette->tilfældig(10); $ _SESSION['TOKEN_ID'] = $ TOKEN_ID; Vend tilbage $ TOKEN_ID;   
  2. 2 Opret get_token () fungere. Denne funktion henter symbolværdien, eller hvis en ikke er genereret, genererer en tokenværdi.
     offentlig fungere get_token()  hvis(isset($ _SESSION['Token_value']))  Vend tilbage $ _SESSION['Token_value'];  andet  $ token = hash('SHA256', $ dette->tilfældig(500)); $ _SESSION['Token_value'] = $ token; Vend tilbage $ token;   
  3. 3 Opret check_valid () fungere. Denne funktion bestemmer, om token-id og tokenværdien er begge gyldige. Dette gøres ved at kontrollere værdierne i GET- eller POST-anmodningen mod de værdier, der er gemt i brugerens SESSION-variabel.
     offentlig fungere check_valid($ metode)  hvis($ metode == 'stolpe' || $ metode == 'få')  $ indlæg = $ _POST; $ get = $ _GET; hvis(isset($$ metode[$ dette->get_token_id()]) && ($$ metode[$ dette->get_token_id()] == $ dette->get_token()))  Vend tilbage rigtigt;  andet  Vend tilbage falsk;   andet  Vend tilbage falsk;   

Del fire af fem:
Generering af et tilfældigt navn for hvert formularfelt

  1. 1 Opret form_names () fungere. Denne funktion genererer tilfældige navne til formularfelterne.
     offentlig fungere form_names($ navne, $ regenerere)  $ værdier = matrix(); for hver ($ navne som $ n)  hvis($ regenerere == rigtigt)  frakoblet($ _SESSION[$ n]);  $ s = isset($ _SESSION[$ n]) ? $ _SESSION[$ n] : $ dette->tilfældig(10); $ _SESSION[$ n] = $ s; $ værdier[$ n] = $ s;  Vend tilbage $ værdier;  
  2. 2 Opret tilfældig fungere. Denne funktion genererer en tilfældig streng ved hjælp af Linux-tilfældig fil for at skabe mere entropi.
     privat fungere tilfældig($ len)  hvis (function_exists('openssl_random_pseudo_bytes'))  $ byteLen = intval(($ len / 2) + 1); $ retur = 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); $ retur = ";  hvis (tom($ retur))  til ($ i=0;$ i<$ len;++$ i)  hvis (!isset($ urandom))  hvis ($ i%2==0)  mt_srand(tid()%2147 * 1000000 + (dobbelt)microtime() * 1000000);  $ rand=48+mt_rand()%64;  andet  $ rand=48+ORD($ urandom[$ i])%64;  hvis ($ rand>57) $ rand+=7; hvis ($ rand>90) $ rand+=6; hvis ($ rand==123) $ rand=52; hvis ($ rand==124) $ rand=53; $ retur.=chr($ rand);   Vend tilbage $ retur;  
  3. 3 Luk klassen CSRF beslag.
      
  4. 4Luk csrf.class.php fil.

Fem på fem:
Brug af CSRF-klassefilen

  1. 1 Tilføj CSRF Class-filen til en POST-formular. Koden afbildet her viser dig, hvordan du tilføjer CSRF-klassefilen til en POST-formular for at forhindre et CSRF-angreb.
     <? Php session_start(); omfatte 'Csrf.class.php'; $ CSRF = ny CSRF(); // Generer Token Id og Gyldigt $ TOKEN_ID = $ CSRF->get_token_id(); $ token_value = $ CSRF->get_token($ TOKEN_ID); // Generer tilfældige formularnavne $ form_names = $ CSRF->form_names(matrix('bruger', 'adgangskode'), falsk); hvis(isset($ _POST[$ form_names['bruger']], $ _POST[$ form_names['adgangskode']]))  // Kontroller, at token id og token værdi er gyldige. hvis($ CSRF->check_valid('stolpe'))  // Hent formvariablerne. $ bruger = $ _POST[$ form_names['bruger']]; $ adgangskode = $ _POST[$ form_names['adgangskode']]; // Formular Funktion Går her  // Genoprett en ny tilfældig værdi for formularen. $ form_names = $ CSRF->form_names(matrix('bruger', 'adgangskode'), rigtigt);  ?>