Hoe te beschermen tegen aanvallen met behulp van een intersite-fitting-aanvraag (csrf) in php
Aanval met behulp van een Intersite-Fitting Fake (CSRF) is een kwetsbaarheid van het type webtoepassing wanneer het slachtoffer onbedoeld is, het script in haar browser, dat de huidige sessie van de geautoriseerde gebruiker op een specifieke site gebruikt, gebruikt. CSRF-aanvallen kunnen worden gemaakt via GAP- of postverzoeken. Dit artikel laat u zien hoe u uw webtoepassing kunt beschermen tegen CSRF-aanvallen.
Methode
We zullen twee methoden gebruiken om te beschermen tegen CSRF-aanvallen van uw halen- en postverzoeken.
De eerste methode is om een willekeurige sleutel te gebruiken. Bij elk verzoek is dit een unieke regel die voor elke sessie wordt gegenereerd. We genereren de sleutel en draaien het vervolgens op elke vorm in de vorm van een verborgen veld. Vervolgens controleert het systeem de geldigheid van het formulier, vergelijkt de sleutel en waarde die is opgeslagen in de sessiabele van de gebruiker. Dat wil zeggen, als de aanvaller een verzoek wil genereren, moet hij de belangrijkste waarde kennen.
De tweede methode is het gebruik van willekeurige namen voor elk formulierveld. De waarde van een willekeurige naam voor elk veld wordt opgeslagen in de sessievariabele en nadat het formulier wordt verzonden (Sabmitic heeft plaatsgevonden), genereert het systeem nieuwe willekeurige veldnamen. Dat wil zeggen, als de aanvaller een aanval wil maken, moet hij deze willekeurige namen van de formuliervelden kennen.
Bijvoorbeeld het verzoek dat het zo is

Het zal er als volgt uitzien:

Stappen
Dit is het hoofdbestand dat alle methoden zal bevatten die nodig zijn om CSRF-aanvallen te voorkomen.
Klasse CSRF {

Deze functie ontvangt een sleutel-ID (token) uit de sessievariabele, als het nog niet is gemaakt, genereert het willekeurig token.
Openbare functie get_token_id () {if [} ($ _ sessie [`token_id`]) {return $ _session [`token_id`] -} else {$ token_id = $ thisity-> willekeurig (10) - $ _ sessie [` token_id `] = $ token_id-return $ token_id-}}

Deze functie ontvangt een token-waarde als de waarde nog niet is gegenereerd, dan wordt het gegenereerd.
Openbare functie get_token () {if (isset ($ _ session [`token_value`]) {return_value `] {` token_value `] -} else {$ token = hash (` SHA256 `, $ dit-> willekeurig (500)) - $ _ sessie [`token_value`] = $ token-return $ token-}}

Deze functie controleert op ID-geldigheid en token. Het controleren treedt op door de verkregen waarden te vergelijken bij het krijgen of plaatsen van vragen met de waarden van de sessie-variabele van de gebruiker.
Openbare functie Check_valid ($ Method) {if ($ methode == `Post` || $ Method == `Get`) {$ post = $ _post- $ GET = $ _get-if (Isset ($ {$ Method} [ $ This-> Get_Token_ID ()]) && ($ {$ Method} [$ this-> get_token_id ()] == $ this-> get_token ())) {return true-} anders {return falle-}} anders { RETURN FALSE-}}

Dit is de tweede bescherming tegen CSRF-aanvallen die in dit artikel worden beschreven. Deze functie genereert willekeurige namen voor formuliervelden.
Openbare functie Form_Names ($ namen, $ Regenerate) {$ -waarden = array () - Foreach ($ namen als $ n) {if ($ Regenerate == true) {unset ($ _ sessie [$ n]) -} $ S = Isset ($ _ sessie [$ n]) ? $ _Session [$ n]: $ this-> willekeurig (10) - $ _ sessie [$ n] = $ s- $ -waarden [$ n] = $ s-} retour $ waarden-}

Deze functie genereert een willekeurige reeks met behulp van een willekeurige Linux-fal voor een grotere chaotische waarde van waarden.
Privé-functie willekeurig ($ LEN) {functie_exists (`OpenSSL_RANDOM_SEUDO_BYTES`)) {$ bytelen = intval (($ len / 2) + 1) - $ RETURN = substr (bin2hex (OpenSSL_RANDOM_PENEUDO_BYETES ($ BYTEN)), 0, $ LEN) -} elseF (@is_leadable (`/ dev / urandom`)) {$ f = fopen (`/ dev / urandom`, `r`) - $ urandom = front ($ f, $ len) -fclose ($ f) - $ RETURN = `` -} if (leeg ($ terug)) {voor ($ 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- $ RETOUR.= Chr ($ RAND) -}} Return $ RETURN-}

Dit voltooit de CSRF-klasse.
}
Deze stappen laten u zien hoe u CSRF-klasse kunt gebruiken om te beschermen tegen CSRF-aanvallen.

De onderstaande code toont het gebruik van de CSRF-klasse voor het formulier.
session_start () - omvatten `CSRF.Klas.PHP `- $ CSRF = NIEUWE CSRF () - // Generation ID en TOKEN VALUE $ TOKEN_ID = $ CSRF-> GET_TOKE_ID () - $ TOKEN_VALUE = $ CSRF-> GET_TOKE ($ TOSTEN_ID) - // Generatie van willekeurige namen voor formulier FIELDEN $ FORM_NAMES = $ CSRF-> Form_NAMES (Array (`Gebruiker`, `Wachtwoord`), FALSE) -Als (ISSET ($ _ Post [$ Form_NAMES [`User`]], $ _post [$ form_names [`Wachtwoord` ]])) {// Controleer of de geldige ID en de token-waarde zijn.if ($ CSRF-> Check_Valid (`Post`)) {// krijg variabele formulieren.$ User = $ _Post [$ Form_NAMES [`User`]] - $ Wachtwoord = $ _post [$ form_names [`Wachtwoord`]] - // Molding Methode gaat hier} // genereer een nieuwe willekeurige waarde voor het formulier.$ Form_NAMES = $ CSRF-> FORM_NAMES (ARRAY (`User`, `Wachtwoord`), TRUE) -}?>