Java >> Java tutorial >  >> Tag >> Spring

Fejlkonfiguration af fjedersikkerhed

Jeg så for nylig Mike Wiensers SpringOne2GX tale om Application Security Fallgruber. Det er meget informativt og værd at se, hvis du bruger Springs stak på servletbeholder.

Det mindede mig om en alvorlig Spring Security Fejlkonfiguration, jeg stod over for engang. Skal forklare det på Spring's Guide Project kaldet Securing a Web Application. Dette projekt bruger Spring Boot, Spring Integration og Spring MVC.

Project bruger disse visninger:


@Configuration
public class MvcConfig extends WebMvcConfigurerAdapter {
    
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("home");
        registry.addViewController("/hello").setViewName("hello");
        registry.addViewController("/login").setViewName("login");
    }

}

Hvor "/home", "/" og "/login" URL'er skal være offentligt tilgængelige, og "/hello" kun bør være tilgængelig for godkendte brugere. Her er den originale Spring Security-konfiguration fra Guide:

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home").permitAll()
                .anyRequest().authenticated();
        http
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .inMemoryAuthentication()
                .withUser("user").password("password").roles("USER");
    }
}

Dejligt og forklarende som alle forårets guider er. Den første "configure"-metode registrerer "/" og "home" som offentlige og specificerer, at alt andet skal godkendes. Det registrerer også login-URL. Anden "konfigurer"-metode angiver godkendelsesmetode for rollen "BRUGER". Selvfølgelig vil du ikke bruge det på denne måde i produktionen!

Nu vil jeg ændre denne kode en smule.

@Override
    protected void configure(HttpSecurity http) throws Exception {
        //!!! Don't use this example !!!
        http
            .authorizeRequests()              
                .antMatchers("/hello").hasRole("USER");
        
        //... same as above ...
    }

Alt er offentligt, og private endepunkter skal angives. Du kan se, at min ændrede kode har samme adfærd som originalen. Faktisk gemte den en linje kode.

Men der er et alvorligt problem med dette. Hvad hvis mit I skal introducere nyt privat slutpunkt? Lad os sige, at jeg ikke er klar over, at det skal registreres i Spring Security-konfigurationen. Mit nye slutpunkt ville være offentligt. En sådan fejlkonfiguration er virkelig svær at fange og kan føre til uønsket eksponering af URL'er.

Så konklusionen er:Autentificer altid alle endepunkter som standard.

Java tag