Како да се заштити од напади со користење на барање за мешање (csrf) во php

Нападот со користење на лажни (CSRF) е тип на ранливост на веб апликации кога жртвата ненамерно ја започнува сценариото во својот прелистувач, која ја користи тековната сесија на овластениот корисник на одредена локација. CSRF напади може да се направи преку Get или Post барања. Оваа статија ќе ви покаже како да ја заштитите вашата веб апликација од нападите на CSRF.

Метод

Ние ќе користиме два методи за заштита од напади на CSRF на вашите GET и POST барања.

Првиот метод е да се користи случаен клуч. Со секое барање, ова е единствена линија генерирана за секоја сесија. Ние го генерираме клучот, а потоа го претвораме во секоја форма во форма на скриено поле. Следно, системот ја проверува валидноста на формуларот, споредувајќи го клучот и вредноста складирана во променливата сесија на корисникот. Тоа е, ако напаѓачот сака да генерира барање, тој ќе треба да ја знае клучната вредност.

Вториот метод е употребата на случајни имиња за секоја форма на форма. Вредноста на случајно име за секое поле е зачувана во променливата на сесија и по испраќањето на образецот (се случи Sabmitic), системот генерира нови случајни имиња на поле. Тоа е, ако напаѓачот сака да направи напад, тој ќе треба да ги знае овие случајни имиња на полињата за форма.

На пример, барањето што го направило тоа

Сликата насловена WaskScsrf.jpg

Тоа ќе изгледа вака:

Слика со наслов ProtedRequestcsrf.jpg

Чекори

Метод 1 од 2:
Креирање на датотека со CSRF.Класа.php

Ова е главната датотека која ќе ги содржи сите методи потребни за да се спречи нападите на CSRF.

  1. Сликата насловена 2543022 1
Еден. Креирајте CSRF датотека.Класа.php.Започнете со создавање на датотека и зачувајте ја со следниве содржини:

Сите кодови во овој дел од Прирачникот ќе бидат додадени на крајот од оваа датотека.
  • Слика под наслов 2543022 2
    2. Креирај метод Get_token_id ().
    Оваа функција добива клучна идентификација (токен) од променливата на сесија, ако сè уште не е креирана, таа генерира случаен токен.

    Јавна функција GET_TOKEN_ID () {Ако (Isset ($ _ сесија [`token_id`])) {Врати $ _SESSION [`token_id`] -} {$ token_id = $ Ова->Случаен (10) - $ _ сесија [`token_id`] = $ token_id-return $ token_id-}}
  • Сликата насловена 2543022 3
    3. Креирај метод Get_Token ().
    Оваа функција добива токен вредност, ако вредноста сè уште не е генерирана, тогаш таа е генерирана.

    Јавна функција get_token () {ако (isset ($ _ сесија [`token_value`]) {return_value] -}} {$ token = hash (`sha256`, $ ова->Случаен (500)) - $ _ сесија [`token_value`] = $ token-враќање $ token-}}}}}}}}}}
  • Сликата насловена 2543022 4
    Четири. Креирај check_valid () метод.
    Оваа функција проверки на идентификација валидност и токен. Проверката се јавува со споредување на вредностите добиени кога добиваат или објавуваат пребарувања со вредностите на променливата на сесија на корисникот.

    Јавна функција Check_Valid ($ метод) {Ако ($ метод == "Пост" || $ media == `get`) {$ post = $ _POST- $ get = $ _GET-Ако ($ {$ member} [ $ Ова->get_token_id ()]) && ($ {$ метод} [$ ова->get_token_id ()] == $ ова->get_token ())) {Врати Вистинско-} {Врати лажно-}}} {Врати лажно-}}
  • Сликата насловена 2543022 5
    Пет. Направете го методот Form_Names ().
    Ова е втора заштита против нападите на CSRF опишани во овој напис. Оваа функција генерира случајни имиња за полиња за форма.

    Форма на јавни функции ($ Имиња, $ Регенерира) {$ вредности = низа () - foreach ($ Имиња како $ n) {ако ($ REGENERERERE == TRUE) {UNFECT ($ _ сесија [$ n]) -} $ s = isset ($ _ сесија [$ n]) ? $ _Session [$ n]: $ ова->Случаен (10) - $ _ сесија [$ n] = $ s- $ вредности [$ n] = $ s-} се врати $ вредности-}
  • Слика под наслов 2543022 6
    6. Креирај случаен () метод.
    Оваа функција генерира случајна низа со користење на случаен Линукс ФАЛ за поголема хаотична вредност на вредностите.

    Приватни функција Случаен ($ len) {function_exists (`openssl_random_seudo_bytes`) {$ bytelen = Intval (($ Len / 2) + 1) - $ REVER = SUBSTR (Bin2Hex (OpenSsl_Random_peneudo_byetes ($ byten)), 0, $ len) -} estrif (@is_readable (`/ dev / arandom`)) {$ f = fopen (`/ dev / arandom`, `r`) - $ URANDOM = FRAD ($ F, $ Len) -Fclose ($ F) - $ враќање = `` -} ако (празен ($ се врати)) {за ($ i = 0- $ i<$ Len - ++ $ i) {ако (!ISSET ($ URANDOM)) {Ако ($ i% 2 == 0) {mt_srand (време ()% 2147 * 1000000 + (двојно) микротима () * 1000000) -} $ rand = 48 + mt_rand ()% 64- } друго {$ rand = 48 + ord ($ urandom [$ i])% 64-} Ако ($ rand>57) $ rand + = 7-ако ($ rand>90) $ RAND + = 6-IF ($ RAND == 123) $ RAND = 52-IF ($ RAND == 124) $ RAND = 53- $ Враќање.= CHR ($ rand) -}} Врати $ return-}
  • Слика под наслов 2543022 7
    7. Завршете ја затворената класа.
    Ова ќе ја заврши CSRF класата.

    }
    Сега можете да ја затворите датотеката CSRF.Класа.php, бидејќи завршивме со него.
  • Метод 2 од 2:
    Заштита на страницата со CSRF.Класа.php

    Овие чекори ќе ви покажат како да користите CSRF класа за заштита од CSRF напади.

    Слика под наслов 2543022 8
    Еден. Пост одбранбена форма.
    Кодот подолу ја прикажува употребата на CSRF класата за формата.

    Слични публикации