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 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 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:
- For eksempel en anmodning, der en gang så så ud:
Del to af fem:
Oprettelse af CSRF-klassefilen
- 1 skab csrf.class.php. Dette er filen, der indeholder alle de funktioner, der bruges til at forhindre CSRF-angreb.
<? Php klasse CSRF
- 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 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 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 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 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 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 Luk klassen CSRF beslag.
- 4Luk csrf.class.php fil.
Fem på fem:
Brug af CSRF-klassefilen
- 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); ?>
Facebook
Twitter
Google+