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

Titel afbeelding Passwordscsrf.jpg

Het zal er als volgt uitzien:

Titel afbeelding ProtectedreQuestChf.jpg

Stappen

Methode 1 van 2:
Een CSRF-bestand maken.Klas.PHP

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

  1. Titel afbeelding 2543022 1
een. Maak een CSRF-bestand.Klas.PHP.Begin met het maken van een bestand en sla deze op met de volgende inhoud:

Klasse CSRF {
Alle Code in dit gedeelte van de handleiding wordt aan het einde van dit bestand toegevoegd.
  • Titel afbeelding 2543022 2
    2. Maak een methode get_token_id ().
    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-}}
  • Titel afbeelding 2543022 3
    3. Maak een methode van get_token ().
    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-}}
  • Titel afbeelding 2543022 4
    4. Maak een check_valid () -methode.
    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-}}
  • Titel afbeelding 2543022 5
    vijf. Maak de methode form_names ().
    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-}
  • Titel afbeelding 2543022 6
    6. Maak een willekeurige () methode.
    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-}
  • Titel afbeelding 2543022 7
    7. Voltooi de class-sluitingsbeugel.
    Dit voltooit de CSRF-klasse.

    }
    Nu kunt u het CSRF-bestand sluiten.Klas.PHP sinds we met hem klaar waren.
  • Methode 2 van 2:
    Paginabescherming met CSRF.Klas.PHP

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

    Titel afbeelding 2543022 8
    een. Post verdedigingsvorm.
    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) -}?>
    Deel in het sociale netwerk:
    Vergelijkbaar