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

Obraz zatytułowany Passwordscrf.jpg

Będzie wyglądać tak:

Obraz zatytułowany ProtectedRequestcsrf.jpg

Kroki

Metoda 1 z 2:
Tworzenie pliku CSRF.Klasa.PHP

Jest to główny plik, który będzie zawierał wszystkie metody niezbędne do zapobiegania atakom CSRF.

  1. Obraz zatytułowany 2543022 1
jeden. Utwórz plik CSRF.Klasa.PHP.Zacznij od utworzenia pliku i zapisać go z następującymi trefiniami:

Klasa csrf {
Cały kod w tej sekcji podręcznika zostanie dodany na końcu tego pliku.
  • Obraz zatytułowany 2543022 2
    2. Utwórz metodę Get_Tokoken_id ().
    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-}}
  • Obraz zatytułowany 2543022 3
    3. Utwórz metodę Get_Token ().
    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-}}
  • Obraz zatytułowany 2543022 4
    cztery. Utwórz metodę Check_Valid ().
    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-}}
  • Obraz zatytułowany 2543022 5
    pięć. Utwórz metodę form_Na ().
    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-}
  • Obraz zatytułowany 2543022 6
    6. Utwórz metodę losową ().
    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-}
  • Obraz zatytułowany 2543022 7
    7. Zakończ wspornik zamykający klasy.
    Spowoduje to zakończenie klasy CSRF.

    }
    Teraz możesz zamknąć plik CSRF.Klasa.PHP, ponieważ skończyliśmy z nim.
  • Metoda 2 z 2:
    Ochrona stron z CSRF.Klasa.PHP

    Kroki te pokażą Ci, jak korzystać z klasy CSRF, aby chronić przed atakami CSRF.

    Obraz zatytułowany 2543022 8
    jeden. Formularz obrony.
    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) -}?>
    Podobne publikacje