Deze wikiHow leert je hoe je een Cross Site Request Forgery (CSRF) Aanval in een PHP-webtoepassing kunt voorkomen door een willekeurig token toe te voegen bij elk verzoek of door een willekeurige naam te gebruiken voor elk formulierveld. Een Cross Site Request Forgery (CSRF) Aanval maakt gebruik van een kwetsbaarheid van de webtoepassing waarbij het slachtoffer onbedoeld een script in zijn browser uitvoert dat gebruik maakt van de ingelogde sessie naar een bepaalde site. CSRF-aanvallen kunnen worden uitgevoerd via GET- of POST-verzoeken.
Deel een van de vijf:
Overzicht van methoden
We zullen twee methoden gebruiken om CSRF-aanvallen op uw GET- en POST-verzoeken te voorkomen:
- 1 Een willekeurig token opnemen bij elk verzoek. Dit is een unieke tekenreeks die voor elke sessie wordt gegenereerd. We genereren het token en nemen het vervolgens op in elke vorm als een verborgen invoer. Het systeem controleert vervolgens of het formulier geldig is door het token te vergelijken met het token dat is opgeslagen in de sessievariabele van de gebruiker. Een aanvaller kan geen verzoek genereren zonder de token-waarde te kennen.
- 2 Een willekeurige naam gebruiken voor elk formulierveld. De waarde van de willekeurige naam voor elk veld wordt opgeslagen in een sessievariabele. Nadat het formulier is ingediend, genereert het systeem een nieuwe willekeurige waarde. Om succesvol te zijn moet een aanvaller deze willekeurige formuliernamen raden.
- Bijvoorbeeld een verzoek dat er ooit zo uitzag:
- Zal er nu als volgt uitzien:
- Bijvoorbeeld een verzoek dat er ooit zo uitzag:
Deel twee van vijf:
Het CSRF-klassenbestand maken
-
1 creëren csrf.class.php. Dit is het bestand dat alle functies bevat die zullen worden gebruikt om CSRF-aanvallen te voorkomen.
<? Php klasse CSRF
- 2 Bewaar het bestand.
- Alle code in delen 2 en 3 wordt aan het einde van dit bestand toegevoegd.
Deel drie van vijf:
Een willekeurige token toevoegen
-
1 Maak het get_token_id () functie. Deze functie haalt de token-ID op uit de sessie van een gebruiker en genereert een niet-token wanneer deze nog niet is gemaakt.
openbaar functie get_token_id() als(isset($ _SESSION['Token_id'])) terugkeer $ _SESSION['Token_id']; anders $ token_id = $ this->willekeurig(10); $ _SESSION['Token_id'] = $ token_id; terugkeer $ token_id;
-
2 Maak het get_token () functie. Deze functie haalt de tokenwaarde op, of genereert een tokenwaarde als deze niet is gegenereerd.
openbaar functie get_token() als(isset($ _SESSION['Token_value'])) terugkeer $ _SESSION['Token_value']; anders $ token = hachee('Sha256', $ this->willekeurig(500)); $ _SESSION['Token_value'] = $ token; terugkeer $ token;
-
3 Maak het check_valid () functie. Deze functie bepaalt of de token-ID en de token-waarde beide geldig zijn. Dit wordt gedaan door de waarden van de GET- of POST-aanvraag te vergelijken met de waarden die zijn opgeslagen in de SESSION-variabele van de gebruiker.
openbaar functie check_valid($ methode) als($ methode == 'post' || $ methode == 'krijgen') $ bericht = $ _POST; $ get = $ _GET; als(isset($$ methode[$ this->get_token_id()]) && ($$ methode[$ this->get_token_id()] == $ this->get_token())) terugkeer waar; anders terugkeer vals; anders terugkeer vals;
Deel vier van vijf:
Een willekeurige naam voor elk formulierveld genereren
-
1 Maak het form_names () functie. Deze functie genereert willekeurige namen voor de formuliervelden.
openbaar functie form_names($ namen, $ regenereren) $ waarden = rangschikking(); foreach ($ namen als $ n) als($ regenereren == waar) ongezet($ _SESSION[$ n]); $ s = isset($ _SESSION[$ n]) ? $ _SESSION[$ n] : $ this->willekeurig(10); $ _SESSION[$ n] = $ s; $ waarden[$ n] = $ s; terugkeer $ waarden;
-
2 Maak het willekeurig functie. Deze functie genereert een willekeurige reeks met behulp van het willekeurige Linux-bestand om meer entropie te maken.
privaat functie willekeurig($ len) als (function_exists('Openssl_random_pseudo_bytes')) $ byteLen = intval(($ len / 2) + 1); $ return = 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 = "; als (leeg($ return)) voor ($ i=0;$ i<$ len;++$ i) als (!isset($ urandom)) als ($ i%2==0) mt_srand(tijd()%2147 * 1000000 + (dubbele)microtime() * 1000000); $ rand=48+MT_RAND()%64; anders $ rand=48+ord($ urandom[$ i])%64; als ($ rand>57) $ rand+=7; als ($ rand>90) $ rand+=6; als ($ rand==123) $ rand=52; als ($ rand==124) $ rand=53; $ return.=chr($ rand); terugkeer $ return;
-
3 Sluit de klas CSRF haakje.
- 4Sluit de csrf.class.php het dossier.
Deel Vijf van Vijf:
Het CSRF Class-bestand gebruiken
-
1 Voeg het CSRF Class-bestand toe aan een POST-formulier. De hier afgebeelde code laat zien hoe u het CSRF Class-bestand aan een POST-formulier toevoegt om een CSRF-aanval te voorkomen.
<? Php session_start(); omvatten 'Csrf.class.php'; $ CSRF = nieuwe CSRF(); // Token-ID genereren en geldig $ token_id = $ CSRF->get_token_id(); $ token_value = $ CSRF->get_token($ token_id); // Genereer willekeurige formuliernamen $ form_names = $ CSRF->form_names(rangschikking('gebruiker', 'wachtwoord'), vals); als(isset($ _POST[$ form_names['gebruiker']], $ _POST[$ form_names['wachtwoord']])) // Controleer of token id en token waarde geldig zijn. als($ CSRF->check_valid('post')) // Haal de formuliervariabelen op. $ user = $ _POST[$ form_names['gebruiker']]; $ password = $ _POST[$ form_names['wachtwoord']]; // Formulierfunctie komt hier // Regenereer een nieuwe willekeurige waarde voor het formulier. $ form_names = $ CSRF->form_names(rangschikking('gebruiker', 'wachtwoord'), waar); ?>
Facebook
Twitter
Google+