Jak chronić przed atakami przy użyciu prośby montażowej (csrf) w php
Atak za pomocą fałszywych monitorów (CSRF) jest typem podatności aplikacji internetowej, gdy ofiara nieumyślnie uruchamia skrypt w swojej przeglądarce, która wykorzystuje bieżącą sesję autoryzowanego użytkownika w określonej witrynie. Ataki CSRF można wykonać za pomocą żądań Get lub Post. Ten artykuł pokaże, jak chronić aplikację internetową z Ataków CSRF.
metoda
Wykorzystamy dwie metody, aby chronić przed atakami CSRF na żądania Get and Post.
Pierwszą metodą jest użycie losowego klucza. Przy każdym żądaniu jest to unikalna linia generowana dla każdej sesji. Generujemy klucz, a następnie włącz go do każdej formy w postaci ukrytego pola. Następnie system sprawdza ważność formularza, porównując klucz i wartość przechowywana w zmiennej sesji użytkownika. To znaczy, jeśli atakujący chce wygenerować prośbę, będzie musiał znać wartość kluczową.
Drugą metodą jest użycie losowych nazw dla każdego pola formularza. Wartość losowej nazwy dla każdego pola jest przechowywana w zmiennej sesji, a po wysłaniu formularza (wystąpił SABMITIT), system generuje nowe losowe nazwy pola. To znaczy, jeśli atakujący chce stworzyć atak, będzie musiał znać te losowe nazwy pól formularza.
Na przykład żądanie, które wydaje się tak
Będzie wyglądać tak:
Kroki
Jest to główny plik, który będzie zawierał wszystkie metody niezbędne do zapobiegania atakom CSRF.
Klasa csrf {
Ta funkcja otrzymuje kluczowy identyfikator (żeton) z zmiennej sesji, jeśli nie został jeszcze utworzony, generuje losowy token.
Funkcja publiczna Get_Token_id () {IF (ISSET ($ _ sesja [`token_id`])) {zwrot $ _Session ["token_id `] -} else {$ token_id = $ to-> losowe (10) - $ _ sesja [" Token_id `] = $ Token_id-Return $ Token_id-}}
Ta funkcja otrzymuje wartość tokena, jeśli wartość nie została jeszcze wygenerowana, to jest generowany.
Funkcja publiczna Get_Token () {IF (ISSET ($ _ sesja ["token_value"]) {RETURN_VALUE `] {` `token_Value`] -} else {$ Token = Hash ("Sha256", $ to-> losowo (500)) - $ _ sesja [`token_value`] = $ token-zwrot $ token-}}
Ta funkcja sprawdza ważność ID i tokena. Sprawdzanie następuje, porównując wartości uzyskane po otrzymaniu lub po zapytaniach z wartościami zmiennej sesji użytkownika.
Funkcja publiczna Check_valid ($ Metoda) {If ($ Methet == `Post` || $ Metoda == `Get`) {$ Post ==_Post- $ Get = $ _get-If (Isset ($ {$ Metoda} [ $ This-> Get_Tokoken_id ()]) && ($ {$ Method} [$ to-> get_Tokoken_id ()] == $ to-> get_ktoken ())) {RETURN True-} Else {RETURE FALSH}} Else { Zwróć false-}}
Jest to druga ochrona przed atakami CSRF opisana w tym artykule. Ta funkcja generuje losowe nazwy dla pól formularza.
Funkcja publiczna Form_names ($ Nazwy, $ Regenerate) {$ Value = Array () - Foreach ($ Nazwy jako $ n) {If ($ Regenerate == True) {Unset ($ _ sesja [$ n]) -} $ S = ISSET ($ _ sesja [$ n]) ? $ _Session [$ n]: $ to-> losowo (10) - $ _ sesja [$ n] = $ s- $ wartości [$ n] = $ s-} zwrot $ wartości-}
Ta funkcja generuje losowy ciąg za pomocą losowego Linux FAL dla większej wartości chaotycznej wartości.
Prywatna funkcja Losowa ($ Len) {Function_exists ("Openssl_random_seudo_bytes")) {$ BYTELEN = INTVAL (($ LEN / 2) + 1) - $ RETURN = substr (BIN2HEX (openssl_random_peneudo_byetes ($ Byten)), 0, $ Len) -} EluSif (@is_Readable (`/ dev / urandom`)) {$ F = Fopen (`/ Dev / Urandom`, `R`) - $ Urandom = Fread ($ F, $ Len) -fClose ($ F) - $ RETURN = `` -} If (pusty ($ Return)) {za ($ 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- $ RETURN.= CHR ($ Rand) -}} Return $ Returt-}
Spowoduje to zakończenie klasy CSRF.
}
Kroki te pokażą Ci, jak korzystać z klasy CSRF, aby chronić przed atakami CSRF.
Poniższy kod pokazuje zastosowanie klasy CSRF dla formularza.
session_start () - obejmują "CSRF.Klasa.PHP `- $ CSRF = Nowy identyfikator CSRF () - // Identyfikator generacji i wartość Token $ Token_id = $ CSRF-> Get_Token_id () - $ Token_Value = $ CSRF-> Get_Token ($ Token_id) - // Wygeneracja losowych nazw dla formularza Fields $ Form_names = $ CSRF-> Form_Names (Array ("Użytkownik", "Hasło"), False) -F (Isset ($ _ Post [$ Form_Names [`User`]], $ _POST [$ Form_names [`Hasło " ])) {// Sprawdź, czy ważny identyfikator i wartość tokena są.Jeśli ($ CSRF-> Check_valid ("Post")) {// Uzyskaj formularze zmienne.$ user = $ _Post [$ form_names [`user`]] - $ Hasło = $ _POST [$ Form_Names [`Hasło`]] - // Metoda formowania Idzie tutaj} // Wygeneruj nową wartość losową dla formularza.$ form_names = $ csrf-> form_names (tablica ("użytkownik", "hasło"), true) -}?>