CSRF védelem Spring MVC és Thymeleaf

1. Bemutatkozás

A Thymeleaf egy Java sablonmotor HTML, XML, JavaScript, CSS és sima szöveg feldolgozására és létrehozására. A Thymeleaf and Spring bevezetőjéhez nézze meg ezt az írást.

Ebben a cikkben megvitatjuk, hogyan kell megakadályozza a webhelyek közötti kérelem hamisítását (CSRF) tavasszal MVC Thymeleaf alkalmazással. Pontosabban: teszteljük a CSRF támadást a HTTP POST módszerrel.

A CSRF egy olyan támadás, amely arra kényszeríti a végfelhasználót, hogy hajtson végre nemkívánatos műveleteket egy webalkalmazásban, amelyben jelenleg hitelesítve van.

2. Maven-függőségek

Először nézzük meg a Thymeleaf és a Spring integrálásához szükséges konfigurációkat. A tűlevelű-tavaszi könyvtárra van szükség a függőségeinkben:

 org.thymeleaf thymeleaf 3.0.11.KÖZLEMÉNY org. thymeleaf thymeleaf-spring5 3.0.11. 

Vegye figyelembe, hogy egy 4. tavaszi projekt esetében a tűlevelű-tavasz4 könyvtár helyett kell használni kakukkfű-tavasz5. A függőségek legújabb verziója itt található.

Ezenkívül a Spring Security használatához hozzá kell adnunk a következő függőségeket:

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

Két Spring Security programhoz kapcsolódó könyvtár legújabb verziói itt és itt érhetők el.

3. Java konfiguráció

Az itt tárgyalt Thymeleaf konfiguráció mellett hozzá kell adnunk a Spring Security konfigurációját. Ehhez létre kell hoznunk az osztályt:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity (securedEnabled = true, prePostEnabled = true) nyilvános osztály WebMVCSecurity kiterjeszti a WebSecurityConfigurerAdapter {@Bean @Override public AuthenticationManager authenticationManagerBean (superanager) } @Orride védett void konfigurálás (AuthenticationManagerBuilder auth) dobja a (z) {auth.inMemoryAuthentication () .withUser ("user1"). Jelszót ("{noop} user1Pass") .authorities ("ROLE_USER") kivételt; } @Orride public void configure (WebSecurity web) dobja a Kivételt {web.ignoring (). AntMatchers ("/ resources / **"); } A @Orride protected void configure (HttpSecurity http) dobja a Kivételt {http .authorizeRequests () .anyRequest () .authenticated () .és () .httpBasic (); }}

A Biztonsági konfiguráció további részletei és leírása a Biztonság rugóval sorozatban található.

A CSRF védelem alapértelmezés szerint engedélyezve van a Java konfigurációval. Ennek a hasznos szolgáltatásnak a letiltásához hozzá kell adnunk ezt Beállítás(…) módszer:

.csrf (). disable ()

XML konfigurációban manuálisan kell megadnunk a CSRF védelmet, különben nem fog működni:

Felhívjuk figyelmét arra is, hogy ha bejelentkezési oldalt használunk bejelentkezési űrlappal, akkor a CSRF tokent mindig be kell foglalnunk a bejelentkezési űrlapba rejtett paraméterként manuálisan a kódban:

A fennmaradó űrlapoknál a CSRF token automatikusan hozzá lesz adva a rejtett bemenetű űrlapokhoz:

4. Nézetek konfigurálása

Folytassuk a HTML-fájlok fő részét formanyomtatványokkal és tesztelési eljárások létrehozásával. Az első nézetben megpróbálunk új hallgatót felvenni a listába:

   Add Student 

Ebben a nézetben egy hallgatót felveszünk a listába azáltal, hogy megadjuk id, név, nem és százalék (opcionálisan, az űrlap érvényesítésében leírtak szerint). Mielőtt ezt az űrlapot végrehajthatnánk, meg kell adnunk felhasználó és Jelszó, hogy hitelesítsen minket egy webalkalmazásban.

4.1. Böngésző CSRF-támadás tesztelése

Most folytatjuk a második HTML nézetet. Ennek célja megpróbálni CSRF támadást végrehajtani:

Tudjuk, hogy a művelet URL-je // localhost: 8080 / spring-thymeleaf / saveStudent. A hacker ehhez az oldalhoz akar hozzáférni támadás végrehajtása érdekében.

A teszteléshez nyissa meg a HTML fájlt egy másik böngészőben, anélkül, hogy bejelentkezne az alkalmazásba. Amikor megpróbálja elküldeni az űrlapot, megkapjuk az oldalt:

Kérésünket elutasítottuk, mert CSRF token nélküli kérést küldtünk.

Felhívjuk figyelmét, hogy a HTTP munkamenetet használják a CSRF tokenek tárolására. A kérelem elküldésével Spring összehasonlítja a létrehozott tokent a munkamenetben tárolt tokennel annak megerősítése érdekében, hogy a felhasználót nem feltörték.

4.2. JUnit CSRF Attack Testing

Ha nem akarja böngésző segítségével tesztelni a CSRF támadást, akkor megteheti egy gyors integrációs teszten keresztül is; kezdjük az adott teszt Spring konfigurációjával:

@RunWith (SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration (class = {WebApp.class, WebMVCConfig.class, WebMVCSecurity.class, InitSecurity.class}) public class CsrfEnabledIntegrationTest {// configuration

És folytassa a tényleges tesztekkel:

A @Test public void addStudentWithoutCSRF () kiveti a (z) {mockMvc.perform (post ("/ saveStudent"). ContentType (MediaType.APPLICATION_JSON) .param ("id", "1234567"). Param ("név", "Joe") kivételt. .param ("gender", "M") .withel (testUser ())). ésExpect (status (). isForbidden ()); } @Test public void addStudentWithCSRF () dobja a Kivételt {mockMvc.perform (post ("/ saveStudent"). ContentType (MediaType.APPLICATION_JSON) .param ("id", "1234567"). Param ("név", "Joe") ) .param ("gender", "M") .withel (testUser ()). (csrf ()) -vel. ésExpect (status (). isOk ()); }

Az első teszt tiltott állapotot eredményez a hiányzó CSRF token miatt, míg a második megfelelően fog végrehajtódni.

5. Következtetés

Ebben a cikkben megvitattuk, hogyan lehet megakadályozni a CSRF támadásokat a Spring Security és a Thymeleaf keretrendszer használatával.

Ennek az oktatóanyagnak a teljes megvalósítása megtalálható a GitHub projektben - ez egy Eclipse alapú projekt, ezért könnyen importálhatónak és futtathatónak kell lennie.