Será que você realmente está protegendo suas urls?

Esse é um post rápido, mas pode ser útil para quem utiliza o Spring Security em suas aplicações. Não sei se você já percebeu, mas para cada url mapeada através de um @RequestMapping, por default, você também tem a possibilidade de acessar variações dela. Veja o seguinte exemplo:

	@RequestMapping("/produtos/form")
	public ModelAndView form(@ModelAttribute Product product){
		ModelAndView modelAndView = new ModelAndView("products/form");
		modelAndView.addObject("bookTypes", BookType.values());
		return modelAndView;
	}

Além de poder acessar o endereço a partir da url mapeada, também podemos acessar alguma variações.

  • /produtos/form/
  • /produtos/form.

Parece inofensivo, não? Agora e se você tiver utilizado o Spring Security para proteger essa url?

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests()		
		.antMatchers("/produtos/form").hasRole("ADMIN")
                //outras configurações

	}

Nessa situação, caso a pessoa tente acessar o endereço protegido usando uma das variações, ela vai conseguir! Caso você queira se proteger disso através do próprio Spring Security, pode alterar a configuração de url e usar uma regex, ao invés do AntMatcher.

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.authorizeRequests()
		.regexMatchers("/produtos/form[/\\.]?").hasRole("ADMIN")
		//outras configurações

Uma outra abordagem é fazer a servlet do Spring MVC ignorar os caminhos que não baterem exatamente com os configurados.

	@Override
	public void configurePathMatch(final PathMatchConfigurer configurer) {
		configurer.setUseSuffixPatternMatch(false);
		configurer.setUseTrailingSlashMatch(false);
	}

Basta que você sobreescreva o método configurePathMatch e invoque os métodos acima. A classe PathMatchConfigurer é justamente a responsável por guardar essas configurações. Tome apenas um cuidado, no momento em que você passa a ignorar tudo que vem depois do caminho configurado, você deixou de ter o suporte as facilidades para devolver outros tipos, que não o HTML, por exemplo quando você quer retornar json usando o sufixo .json. Agora você sempre se apoiará no cabeçalho accept do HTTP. Já tinha passado por essa situação? Como você tinha resolvido?

 

Advertisements

2 thoughts on “Será que você realmente está protegendo suas urls?

  1. Dica bacana e útil! Essa eu não conhecia!

    Normalmente eu uso o ant-matcher do Spring Security, a URL ficaria como “/produtos/form/**”.

    Um abraço!

    Like

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s