Ochrana CSRF s pružinami MVC a Thymeleaf

1. Úvod

Thymeleaf je šablónový modul Java na spracovanie a vytváranie formátov HTML, XML, JavaScript, CSS a holého textu. Pre úvod do Thymeleaf a Spring si pozrite tento článok.

V tomto článku si povieme, ako na to zabrániť útokom CSRF (Cross-Site Request Forgery) na jar MVC s aplikáciou Thymeleaf. Aby sme boli konkrétnejší, otestujeme útok CSRF pre metódu HTTP POST.

CSRF je útok, ktorý núti koncového používateľa vykonávať nechcené akcie vo webovej aplikácii, ktorá je momentálne autentifikovaná.

2. Maven závislosti

Najskôr sa pozrime na konfigurácie potrebné na integráciu Thymeleaf s Spring. The tymianovy-jar v našich závislostiach sa vyžaduje knižnica:

 org.thymeleaf thymeleaf 3.0.11.RELEASE org.thymeleaf thymeleaf-spring5 3.0.11.RELEASE 

Upozorňujeme, že v prípade projektu na jar 4 sa projekt thymeleaf-spring4 namiesto. musí byť použitá knižnica thymeleaf-spring5. Najnovšiu verziu závislostí nájdete tu.

Aby sme navyše mohli používať Spring Security, musíme pridať nasledujúce závislosti:

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

Najnovšie verzie dvoch knižníc súvisiacich s jarným zabezpečením sú k dispozícii tu a tu.

3. Konfigurácia Java

Okrem tu popísanej konfigurácie Thymeleaf musíme pridať konfiguráciu pre Spring Security. Aby sme to dosiahli, musíme vytvoriť triedu:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity (secureEnabled = true, prePostEnabled = true) verejná trieda WebMVCSecurity rozširuje WebSecurityConfigurerAdapter {@Bean @Override public AuthenticationManager authenticationManagerBean () vyvolá výnimku {return super.auth } @Override protected void configure (AuthenticationManagerBuilder auth) hodí výnimku {auth.inMemoryAuthentication () .withUser ("user1"). Heslo ("{noop} user1Pass") .authorities ("ROLE_USER"); } @Override public void configure (WebSecurity web) vyvolá výnimku {web.ignoring (). AntMatchers ("/ resources / **"); } @Override protected void configure (HttpSecurity http) vyvolá výnimku {http .authorizeRequests () .anyRequest () .authenticated () .and () .httpBasic (); }}

Viac podrobností a popisu konfigurácie zabezpečenia nájdete v sérii Zabezpečenie s pružinou.

Ochrana CSRF je predvolene povolená pri konfigurácii Java. Aby sme mohli deaktivovať túto užitočnú funkciu, musíme ju pridať do konfigurovať (…) metóda:

.csrf (). disable ()

V konfigurácii XML musíme špecifikovať ochranu CSRF manuálne, inak to nebude fungovať:

Upozorňujeme tiež, že ak používame prihlasovaciu stránku s prihlasovacím formulárom, musíme do prihlasovacieho formulára vždy zahrnúť token CSRF ako skrytý parameter ručne v kóde:

U zostávajúcich formulárov sa token CSRF automaticky pridá do formulárov so skrytým vstupom:

4. Konfigurácia pohľadov

Prejdime k hlavnej časti súborov HTML s akciami formulárov a vytvorením testovacej procedúry. V prvom zobrazení sa pokúsime pridať nového študenta do zoznamu:

   Pridajte študenta 

V tomto zobrazení pridávame študenta do zoznamu poskytnutím id, názov, rod a percentuálny podiel (voliteľne, ako je uvedené vo overení formulára). Pred vykonaním tohto formulára musíme poskytnúť používateľ a heslo, aby nás overili vo webovej aplikácii.

4.1. Testovanie útoku CSRF v prehliadači

Teraz pokračujeme k druhému zobrazeniu HTML. Účelom je pokúsiť sa o útok CSRF:

Vieme, že adresa URL akcie je // localhost: 8080 / spring-thymeleaf / saveStudent. Hacker chce získať prístup na túto stránku a vykonať útok.

Ak chcete otestovať, otvorte súbor HTML v inom prehliadači bez prihlásenia do aplikácie. Keď sa pokúsite odoslať formulár, zobrazí sa nám stránka:

Naša žiadosť bola zamietnutá, pretože sme poslali žiadosť bez tokenu CSRF.

Upozorňujeme, že relácia HTTP sa používa na uloženie tokenu CSRF. Po odoslaní žiadosti porovná Spring vygenerovaný token s tokenom uloženým v relácii, aby potvrdil, že používateľ nie je napadnutý hackermi.

4.2. JUnit CSRF Attack Testing

Ak nechcete testovať útok CSRF pomocou prehliadača, môžete to urobiť aj pomocou rýchleho testu integrácie; začnime s konfiguráciou Spring pre tento test:

@RunWith (SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration (classes = {WebApp.class, WebMVCConfig.class, WebMVCSecurity.class, InitSecurity.class}) verejná trieda CsrfEnabledIntegrationTest {//}

A prejdite k samotným testom:

@ Test public void addStudentWithoutCSRF () vyvolá výnimku {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 () throws Exception {mockMvc.perform (post ("/ saveStudent"). ContentType (MediaType.APPLICATION_JSON) .param ("id", "1234567"). Param ("name", "Joe" ) .param ("pohlavie", "M"). s (testUser ()). s (csrf ())). andExpect (status (). isOk ()); }

Prvý test bude mať za následok zakázaný stav kvôli chýbajúcemu tokenu CSRF, zatiaľ čo druhý bude vykonaný správne.

5. Záver

V tomto článku sme diskutovali o tom, ako zabrániť útokom CSRF pomocou rámca Spring Security a Thymeleaf.

Celú implementáciu tohto tutoriálu nájdete v projekte GitHub - jedná sa o projekt založený na Eclipse, takže by malo byť ľahké ho importovať a spustiť tak, ako je.


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