web-dev-qa-db-fra.com

StrictHttpFirewall au printemps sécurité 4.2 vs printemps MVC @MatrixVariable

Après avoir mis à niveau la sécurité de sécurité 4.2.4, j'ai découvert que StrictHttpFirewall est maintenant la valeur par défaut. Malheureusement, il ne joue pas bien avec le printemps MVC @MatrixVariable depuis ";" ne sont plus autorisés. Comment se déplacer?

Exemple:

@GetMapping(path = "/{param}")
public void example(@PathVariable String param,
                    @MatrixVariable Map<String, String> matrix) {
    //...
}

Cela pourrait s'appeler comme ça:

mockMvc.perform(get("/someparam;key=value"))

Et la carte matricielle serait peuplée. Maintenant, la sécurité du printemps le bloque.

org.springframework.security.web.firewall.RequestRejectedException: The request was rejected because the URL contained a potentially malicious String ";"

at org.springframework.security.web.firewall.StrictHttpFirewall.rejectedBlacklistedUrls(StrictHttpFirewall.Java:140)

Je pourrais utiliser un HttpFirewall personnalisé qui autoriserait les points-virgules. Est-il possible d'utiliser @MatrixVariable sans utiliser de caractères interdits?

BTW: le javadoc est incorrect https://docs.spring.io/autorepo/docs/spring-security/4.2.x/apidocs/index.html?org/springframework/security/web/firewall/StrictHttpFirewall. html

Puisque:

5.0.1

Je suppose que c'était backported?

14
Крис

Vous pouvez diluer le pare-feu de sécurité Spring par défaut à l’aide de votre instance personnalisée définie de StrictHttpFirewall (à vos risques et périls).

@Bean
public HttpFirewall allowUrlEncodedSlashHttpFirewall() {
    StrictHttpFirewall firewall = new StrictHttpFirewall();
    firewall.setAllowUrlEncodedSlash(true);
    firewall.setAllowSemicolon(true);
    return firewall;
}

Et ensuite, utilisez ce bean de pare-feu personnalisé dans WebSecurity (le démarrage de Spring n’a pas besoin de cette modification)

@Override
public void configure(WebSecurity web) throws Exception {
  super.configure(web);
  // @formatter:off
  web.httpFirewall(allowUrlEncodedSlashHttpFirewall());
...
}

Cela fonctionnera avec Spring Security 4.2.4+, mais bien sûr, cela comporte des risques!

26
Munish Chandel

Comme mentionné par Крис dans un commentaire, si vous préférez utiliser une approche XML, vous pouvez ajouter la partie suivante à votre securityContext.xml (ou à tout autre nom appelé par xml-config, lié à Spring-Security):

<bean id="allowSemicolonHttpFirewall" 
      class="org.springframework.security.web.firewall.StrictHttpFirewall"> 
        <property name="allowSemicolon" value="true"/> 
</bean> 
<security:http-firewall ref="allowSemicolonHttpFirewall"/>

Le <bean> La partie définit un nouveau bean StrictHttpFirewall avec l'identifiant allowSemicolonHttpFirewall qui est ensuite défini comme pare-feu http par défaut dans le <security> tag en référençant l'identifiant.

4
morten.c

J'ai utilisé la combinaison des deux suivants

  1. https://stackoverflow.com/a/48636757/6780127
  2. https://stackoverflow.com/a/30539991/6780127

  • Le premier a résolu le The request was rejected because the URL contained a potentially malicious String ";"
  • Deuxième résolu le Spring MVC Missing matrix variable

Comme j'utilise Spring Security avec Spring Web, je devais faire les deux. Le problème est maintenant résolu.

J'ai trouvé en utilisant @MatrixVariable Le motif suivant est utile. Premier dans l'URL {num} doit être mentionné pour l'utiliser comme @MatrixVariable

@RequestMapping(method = RequestMethod.GET,value = "/test{num}")
@ResponseBody
public ResponseEntity<String> getDetail(@MatrixVariable String num){
    return new ResponseEntity<>("test"+num, HttpStatus.OK);
}
0
Swapnil Nakate