Как да се предпазим от атаки с помощта на internitite-подходяща запитване (csrf) в php
Атака с помощта на мечта-фитинг Fake (CSRF) е вид уязвимост на уеб приложение, когато жертвата неволно пуска скрипта в браузъра си, който използва текущата сесия на оторизирания потребител в конкретен сайт. CSRF атаки могат да бъдат направени чрез получаване или пост заявки. Тази статия ще ви покаже как да защитите уеб приложението от атаките на CSRF.
Метод
Ще използваме два метода за защита срещу атаки на CSRF от вашите заявки за получаване и публикуване.
Първият метод е да се използва произволен клавиш. С всяка молба, това е уникална линия генерира за всяка сесия. Ние генерира ключ, след което го включете на всеки вид под формата на скрито поле. На следващо място, системата проверява валидността на формата, като се сравняват ключа и стойността се съхранява в променлива сесия на потребителя. Това означава, че ако нападателят иска да генерира искане, той ще трябва да се знае стойност на ключа.
Вторият метод е използването на произволни имена за всяко поле форма. Стойността на произволно име за всяко поле се съхранява в променливата на сесията и след изпращане на формата (настъпили sabmitic), системата генерира нови имена случаен полеви. Това означава, че ако нападателят иска да направи атака, той ще трябва да се знае тези случайни имена на полетата на формуляра.
Така например, по молба, че го е направил, изглежда по този начин

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

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

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

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

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

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

Тази функция генерира произволен низ чрез случайна 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) -}} Върни $ завръщане}

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

Кодът по-долу показва използването на класа 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