CSRF zaštita s opružnim MVC i majčinom dušicom

1. Uvod

Thymeleaf je Java predložak za obradu i stvaranje HTML-a, XML-a, JavaScript-a, CSS-a i otvorenog teksta. Za uvod u majčinu dušicu i proljeće, pogledajte ovaj članak.

U ovom ćemo članku razgovarati o tome kako spriječiti napade krivotvorenja zahtjeva za više web lokacija (CSRF) u proljeće MVC s primjenom majčine dušice. Da budemo precizniji, testirat ćemo CSRF napad za HTTP POST metodu.

CSRF je napad koji primorava krajnjeg korisnika na izvršavanje neželjenih radnji u web aplikaciji u kojoj je trenutno autentifikacija.

2. Ovisnosti Mavena

Prvo, pogledajmo konfiguracije potrebne za integraciju majčine dušice s Springom. The majčina dušica-proljeće knjižnica je potrebna u našim ovisnostima:

 timijanov list orgy 3.0.11.OSLOBODITI timijanov list-proljeće5 3.0.11. 

Za projekt Spring 4, majčina dušica-proljeće4 knjižnica se mora koristiti umjesto majčina dušica-proljeće5. Najnoviju verziju ovisnosti možete pronaći ovdje.

Štoviše, da bismo koristili Spring Security, moramo dodati sljedeće ovisnosti:

 org.springframework.security spring-security-web 5.2.3.RELEASE org.springframework.security spring-security-config 5.2.3.RELEASE 

Najnovije verzije dviju knjižnica vezanih uz Spring Security dostupne su ovdje i ovdje.

3. Java konfiguracija

Pored ovdje obrađene Thymeleaf konfiguracije, moramo dodati konfiguraciju za Spring Security. Da bismo to učinili, moramo stvoriti klasu:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity (securedEnabled = true, prePostEnabled = true) javna klasa WebMVCSecurity proširuje WebSecurityConfigurerAdapter {@Bean @Override public AuthenticationManager authenticationManagerBeaneanBeangenagerManagerBeanBeanBeanBeanBeanBeanBeanBeanBeanBeanBannerBeanBeanBeangeangeangenagerManagerBeanBeanner } @Override zaštićena void konfiguracija (AuthenticationManagerBuilder auth) baca izuzetak {auth.inMemoryAuthentication () .withUser ("user1"). Password ("{noop} user1Pass") .authorities ("ROLE_USER"); } @Override public void configure (WebSecurity web) baca iznimku {web.ignoring (). AntMatchers ("/ resources / **"); } @Override zaštićena void konfiguracija (HttpSecurity http) baca iznimku {http .authorizeRequests () .anyRequest () .authenticated () .and () .httpBasic (); }}

Za više detalja i opis sigurnosne konfiguracije, uputit ćemo se na seriju Sigurnost s proljećem.

CSRF zaštita omogućena je prema zadanim postavkama s Java konfiguracijom. Da bismo onemogućili ovu korisnu značajku, moramo je dodati konfigurirati(…) metoda:

.csrf (). disable ()

U XML konfiguraciji moramo ručno odrediti CSRF zaštitu, inače neće raditi:

Također imajte na umu da ako koristimo stranicu za prijavu s obrascem za prijavu, moramo uvijek uključiti CSRF token u obrazac za prijavu kao skriveni parametar u kodu:

Za preostale obrasce CSRF token automatski će se dodati obrascima sa skrivenim unosom:

4. Konfiguracija prikaza

Krenimo na glavni dio HTML datoteka s radnjama na obrascu i stvaranjem postupka testiranja. U prvom prikazu pokušavamo dodati novog učenika na popis:

   Dodaj učenika 

U ovom pogledu dodajemo učenika na popis pružanjem iskaznica, Ime, spol i postotak (po želji, kako je navedeno u provjeri obrasca). Prije nego što možemo izvršiti ovaj obrazac, moramo ga dostaviti korisnik i zaporka, za autentifikaciju u web aplikaciji.

4.1. Testiranje napada CSRF-a u pregledniku

Sada prelazimo na drugi HTML prikaz. Svrha mu je pokušati izvršiti CSRF napad:

Znamo da je URL radnje // localhost: 8080 / spring-thymeleaf / saveStudent. Haker želi pristupiti ovoj stranici kako bi izvršio napad.

Da biste testirali, otvorite HTML datoteku u drugom pregledniku, bez prijave u program. Kada pokušate poslati obrazac, primit ćemo stranicu:

Naš je zahtjev odbijen jer smo poslali zahtjev bez CSRF tokena.

Imajte na umu da se HTTP sesija koristi za spremanje CSRF tokena. Kada se zahtjev pošalje, Spring uspoređuje generirani token s tokenom pohranjenim u sesiji, kako bi potvrdio da korisnik nije hakiran.

4.2. JUnit CSRF testiranje napada

Ako ne želite testirati CSRF napad pomoću preglednika, možete to učiniti i putem brzog testa integracije; počnimo s Spring konfiguracijom za taj test:

@RunWith (SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration (klase = {WebApp.class, WebMVCConfig.class, WebMVCSecurity.class, InitSecurity.class}) javna klasa CsrfEnabledIntegrationTest {Konfiguracija}

I prijeđite na stvarne testove:

@Test public void addStudentWithoutCSRF () baca iznimku {mockMvc.perform (post ("/ saveStudent"). ContentType (MediaType.APPLICATION_JSON) .param ("id", "1234567"). Param ("name", "Joe") .param ("gender", "M") .with (testUser ())). andExpect (status (). isForbidden ()); } @Test public void addStudentWithCSRF () baca iznimku {mockMvc.perform (post ("/ saveStudent"). ContentType (MediaType.APPLICATION_JSON) .param ("id", "1234567"). Param ("name", "Joe" ) .param ("gender", "M") .with (testUser ()). with (csrf ())). andExpect (status (). isOk ()); }

Prvo testiranje rezultirat će zabranjenim statusom zbog nedostajućeg CSRF tokena, dok će se drugo izvršiti pravilno.

5. Zaključak

U ovom smo članku razgovarali o tome kako spriječiti CSRF napade pomoću Spring Security i Thymeleaf okvira.

Potpuna implementacija ovog vodiča može se naći u projektu GitHub - ovo je projekt zasnovan na Eclipseu, pa bi ga trebalo lako uvesti i pokrenuti kakav jest.


$config[zx-auto] not found$config[zx-overlay] not found