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.