Как да се предпазим от атаки с помощта на internitite-подходяща запитване (csrf) в php

Атака с помощта на мечта-фитинг Fake (CSRF) е вид уязвимост на уеб приложение, когато жертвата неволно пуска скрипта в браузъра си, който използва текущата сесия на оторизирания потребител в конкретен сайт. CSRF атаки могат да бъдат направени чрез получаване или пост заявки. Тази статия ще ви покаже как да защитите уеб приложението от атаките на CSRF.

Метод

Ще използваме два метода за защита срещу атаки на CSRF от вашите заявки за получаване и публикуване.

Първият метод е да се използва произволен клавиш. С всяка молба, това е уникална линия генерира за всяка сесия. Ние генерира ключ, след което го включете на всеки вид под формата на скрито поле. На следващо място, системата проверява валидността на формата, като се сравняват ключа и стойността се съхранява в променлива сесия на потребителя. Това означава, че ако нападателят иска да генерира искане, той ще трябва да се знае стойност на ключа.

Вторият метод е използването на произволни имена за всяко поле форма. Стойността на произволно име за всяко поле се съхранява в променливата на сесията и след изпращане на формата (настъпили sabmitic), системата генерира нови имена случаен полеви. Това означава, че ако нападателят иска да направи атака, той ще трябва да се знае тези случайни имена на полетата на формуляра.

Така например, по молба, че го е направил, изглежда по този начин

Изображение озаглавена Passwordscsrf.jpg

Ще изглежда така:

Изображение озаглавена ProtectedRequestcsrf.jpg

Стъпка

Метод 1 от 2:
Създаване на CSRF файл.Клас.PHP

Това е основната файл, който ще съдържа всички методи, за да се предотврати CSRF атаки.

  1. Изображение озаглавена 2543022 1
един. Създаване на CSRF файл.Клас.PHP.Започнете със създаване на файла и го запишете със следното съдържание:

КЛАС CSRF {
ще бъдат добавени Всички код в този раздел на ръководството в края на този файл.
  • Изображение озаглавена 2543022 2
    2. Създаване на get_token_id () метод.
    Тази функция получава ключ ID (символично) от променливата на сесията, ако тя все още не е създаден, той генерира произволен знак.

    Публична функция Get_Token_id () {ако (Isset ($ _ сесия [ `TOKEN_ID`])) {върне $ _SESSION [ `TOKEN_ID`] -} друг {$ TOKEN_ID = $ това-> Random (10) - $ _ сесия [ ` TOKEN_ID `] = $ TOKEN_ID възвратен $ token_id-}}
  • Изображение озаглавена 2543022 3
    3. Създаване на метод за Get_Token ().
    Тази функция получава символична стойност, ако стойността все още не е генериран, а след това тя се генерира.

    Публична функция Get_Token () {IF (Isset ($ _ сесия [ `token_value`]) {return_value `] {` token_value `] -} друг {$ знак = хеш ( "SHA256`, $ това-> Random (500)) - $ _ сесия [ `token_value`] = $ Token възвратен $ token-}}
  • Изображение озаглавена 2543022 4
    4. Създаване на метод за Check_ValID ().
    Тази функция проверки на ID валидност и символично. Проверка се извършва чрез съпоставяне на данните, получени при GET или POST заявки с ценностите на променлива сесия на потребителя.

    Публична функция Check_Valid ($ метод) {ако ($ Метод == "публикация" || $ Метод == "Получаване") {$ пост = $ _Post- $ Получаване = $ _GET-ако (Isset ($ {$ Метод} [ $ това-> get_token_id ()]) && ($ {$ Метод} [$ това-> get_token_id ()] == $ това-> get_token ())) {ВРЪЩАНЕ вярното} още {ВРЪЩАНЕ фалшиво}} още { ВРЪЩАНЕ фалшиво}}
  • Изображение озаглавена 2543022 5
    пет. Създаване на form_names () метод.
    Това е вторият защита срещу CSRF атаки, описани в тази статия. Тази функция генерира произволни имена за полета на формуляра.

    Публична функция Form_Names ($ Имена, $ регенерира) {$ стойности = масив () - foreach ($ имена като $ п) {ако ($ регенерира == True) {изключено ($ _ сесия [$ п]) -} $ S = Isset ($ _ сесия [$ п]) ? $ _SESSION [$ п]: $ това-> Random (10) - $ _ сесия [$ п] = $ S- $ Стойностите [$ п] = $ S-} Върни $ Values-}
  • Изображение озаглавена 2543022 6
    6. Създаване на начин на Random ().
    Тази функция генерира произволен низ чрез случайна Linux Фал за по-голяма стойност от хаотичен ценности.

    Частен Функция Произволни ($ Len) {function_exists ( "OpenSSL_RANDOM_SEUDO_BYTES")) {$ BYTELEN = INTVAL (($ LEN / 2) + 1) - $ Връщане = SUBSTR върху (BIN2HEX (OpenSSL_RANDOM_PENEUDO_BYETES ($ Byten)), 0, $ Len) -} ElseIf (@is_readable ( "/ ррт / urandom")) {$ F = Fopen ( "/ Dev / urandom", "R") - $ urandom = Fread ($ F, $ Len) -FClose ($ е) - $ връщане = `` -}, ако (празна ($ връщане)) {за ($ аз = 0- $ аз<$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 Ако ($ RAND> 90) $ RAND + = 6-If ($ RAND == 123) $ RAND = 52 Ако ($ RAND == 124) $ RAND = 53- $ ВРЪЩАНЕ.= CHR ($ RAND) -}} Върни $ завръщане}
  • Изображение озаглавена 2543022 7
    7. Завършете скоба клас затваряне.
    Това ще завърши CSRF клас.

    }
    Сега можете да затворите CSRF файла.Клас.PHP, тъй като сме готови с него.
  • Метод 2 от 2:
    Page защита с CSRF.Клас.PHP

    Тези стъпки ще ви покажат как да използвате CSRF клас за защита срещу атаки на CSRF.

    Изображение, озаглавено 2543022 8
    един. Пост отбранителна форма.
    Кодът по-долу показва използването на класа CSRF за формуляра.

    session_start () - включват `csrf.Клас.PHP `- $ csrf = New CSRF () - // ID на поколение и стойност на tocken $ token_id = $ csrf-> get_token_id () - $ token_value = $ csrf-> get_token ($ token_id) - // генериране на случайни имена за формуляр Fields $ form_names = $ csrf-> form_names (array (`потребител`, `password`), false) -аф (ISSET ($ _ пост [$ form_names [`user`]], $ _post [$ form_names [`password` t ]])) {// Проверете дали са валидна стойност на идентификацията и токен.if ($ csrf-> check_valid (`post`)) {// Получаване на променливи форми.$ User = $ _post [$ form_names [`user`]] - $ password = $ _post [$ form_names [`password`]] - // метод на формоване отива тук} // генериране на нова случайна стойност за формуляра.$ form_names = $ csrf-> form_names (масив ("потребител", "парола"), true) -}?. T
    Подобни публикации