CSRF-beskyttelse med fjeder-MVC og Thymeleaf

1. Introduktion

Thymeleaf er en Java-skabelonmotor til behandling og oprettelse af HTML, XML, JavaScript, CSS og almindelig tekst. For en introduktion til Thymeleaf og Spring, se på denne opskrivning.

I denne artikel vil vi diskutere, hvordan man gør det forhindre Cross-Site Request Forgery (CSRF) angreb i foråret MVC med Thymeleaf-applikation. For at være mere specifik vil vi teste CSRF-angreb for HTTP POST-metode.

CSRF er et angreb, der tvinger en slutbruger til at udføre uønskede handlinger i en webapplikation, som i øjeblikket er godkendt.

2. Maven-afhængigheder

Lad os først se de konfigurationer, der kræves for at integrere Thymeleaf med Spring. Det thymeleaf-spring bibliotek kræves i vores afhængigheder:

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

Bemærk, at for et Spring 4-projekt, thymeleaf-spring4 biblioteket skal bruges i stedet for thymeleaf-spring5. Den seneste version af afhængighederne kan findes her.

Desuden er vi nødt til at tilføje følgende afhængigheder for at kunne bruge Spring Security:

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

De nyeste versioner af to Spring Security-relaterede biblioteker er tilgængelige her og her.

3. Java-konfiguration

Ud over den Thymeleaf-konfiguration, der er beskrevet her, skal vi tilføje konfiguration til Spring Security. For at gøre det skal vi oprette klassen:

@Configuration @EnableWebSecurity @EnableGlobalMethodSecurity (secureEnabled = true, prePostEnabled = true) offentlig klasse WebMVCSecurity udvider WebSecurityConfigurerAdapter {@Bean @Override public AuthenticationManager authenticationManagerBean () kaster undtagelse {returnManager). } @ Override beskyttet ugyldig konfiguration (AuthenticationManagerBuilder auth) kaster Undtagelse {auth.inMemoryAuthentication () .withUser ("user1"). Adgangskode ("{noop} user1Pass"). Autoriteter ("ROLE_USER"); } @ Override offentlig tomrumskonfiguration (WebSecurity-web) kaster undtagelse {web.ignoring (). AntMatchers ("/ resources / **"); } @ Override beskyttet ugyldig konfiguration (HttpSecurity http) kaster undtagelse {http .authorizeRequests () .anyRequest () .authenticated () .and () .httpBasic (); }}

For flere detaljer og beskrivelse af sikkerhedskonfiguration henviser vi til serien Security med Spring.

CSRF-beskyttelse er aktiveret som standard med Java-konfiguration. For at deaktivere denne nyttige funktion skal vi tilføje dette i konfigurer (…) metode:

.csrf (). deaktiver ()

I XML-konfiguration skal vi specificere CSRF-beskyttelsen manuelt, ellers fungerer det ikke:

Bemærk også, at hvis vi bruger login-side med loginformular, skal vi altid inkludere CSRF-token i loginformularen som en skjult parameter manuelt i koden:

For de resterende formularer tilføjes CSRF-token automatisk til formularer med skjult input:

4. Visningskonfiguration

Lad os fortsætte til hoveddelen af ​​HTML-filer med formhandlinger og oprettelse af testprocedurer. I den første visning forsøger vi at tilføje en ny elev til listen:

   Tilføj studerende 

I denne visning tilføjer vi en studerende til listen ved at give id, navn, køn og procent (valgfrit som angivet i formvalideringen). Inden vi kan udføre denne formular, skal vi give dem bruger og adgangskode, for at godkende os i en webapplikation.

4.1. Browser CSRF Attack Testing

Nu går vi videre til den anden HTML-visning. Formålet med det er at forsøge at udføre CSRF-angreb:

Vi ved, at handlings-URL'en er // localhost: 8080 / spring-thymeleaf / saveStudent. Hackeren ønsker at få adgang til denne side for at udføre et angreb.

For at teste skal du åbne HTML-filen i en anden browser uden at logge ind på applikationen. Når du prøver at indsende formularen, modtager vi siden:

Vores anmodning blev afvist, fordi vi sendte en anmodning uden et CSRF-token.

Bemærk, at HTTP-session bruges til at gemme CSRF-token. Når anmodningen sendes, sammenligner Spring genereret token med det token, der er gemt i sessionen, for at bekræfte, at brugeren ikke er hacket.

4.2. JUnit CSRF Attack Testing

Hvis du ikke vil teste CSRF-angreb ved hjælp af en browser, kan du også gøre det via en hurtig integrationstest; lad os starte med Spring Config til den test:

@RunWith (SpringJUnit4ClassRunner.class) @WebAppConfiguration @ContextConfiguration (klasser = {WebApp.class, WebMVCConfig.class, WebMVCSecurity.class, InitSecurity.class}) offentlig klasse CsrfEnabledIntegrationTest {// konfiguration}

Og gå videre til de faktiske tests:

@Test offentligt ugyldigt addStudentWithoutCSRF () kaster undtagelse {mockMvc.perform (post ("/ saveStudent"). ContentType (MediaType.APPLICATION_JSON) .param ("id", "1234567"). Param ("navn", "Joe") .param ("køn", "M"). med (testUser ())). og Expect (status (). isForbidden ()); } @Test offentligt ugyldigt addStudentWithCSRF () kaster undtagelse {mockMvc.perform (post ("/ saveStudent"). ContentType (MediaType.APPLICATION_JSON) .param ("id", "1234567"). Param ("navn", "Joe" ) .param ("køn", "M"). med (testUser ()). med (csrf ())). og Expect (status (). isOk ()); }

Den første test vil resultere i en forbudt status på grund af det manglende CSRF-token, mens den anden vil blive udført korrekt.

5. Konklusion

I denne artikel diskuterede vi, hvordan man forhindrer CSRF-angreb ved hjælp af Spring Security og Thymeleaf framework.

Den fulde implementering af denne vejledning kan findes i GitHub-projektet - dette er et Eclipse-baseret projekt, så det skal være let at importere og køre som det er.


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