2014-10-03 11 views
14

Primavera doc dicePrimavera di sicurezza: Abilita/Disabilita CSRF per tipo client (browser/non-browser)

"Quando si utilizza la protezione CSRF La nostra raccomandazione è di usare la protezione CSRF per qualsiasi richiesta che possa essere elaborato da un browser da utenti normali.Se si sta creando solo un servizio che viene utilizzato da client non-browser, è probabile che si desideri disabilitare la protezione CSRF. "

E se il mio servizio verrà utilizzato da entrambi i client "browser" e "non browser" come i servizi esterni di terze parti, la sicurezza di primavera offre un modo per disabilitare csrf esclusivamente per determinati tipi di client?

Riferimento: http://docs.spring.io/spring-security/site/docs/3.2.0.CI-SNAPSHOT/reference/html/csrf.html

+1

Vorrei inserire un programma flash in una pagina del browser, ad esempio che sono un client non browser e attaccare l'utente quando non ha alcuna protezione CSRF. –

+1

@NeilMcGuigan Sto disabilitando CSRF solo per client fidati, che confido che sto stabilendo tramite X509 e SSL/TLS. –

risposta

9

Sono sicuro che c'è un modo per farlo in XML Spring Security, ma dal momento che sto usando Java Config, ecco la mia soluzione.

@Configuration 
@EnableWebSecurity 
public class SecurityConfig { 

    @Configuration 
    @Order(1) 
    public static class SoapApiConfigurationAdapter extends WebSecurityConfigurerAdapter { 
     protected void configure(HttpSecurity http) throws Exception { 
      http 
       .antMatcher("/soap/**") 
       .csrf().disable() 
       .httpBasic(); 
     } 
    } 


    @Configuration 
    public static class WebApiConfigurationAdapter extends WebSecurityConfigurerAdapter { 

     protected void configure(HttpSecurity http) throws Exception { 
      http   
       .formLogin() 
        .loginProcessingUrl("/authentication") 
        .usernameParameter("j_username") 
        .passwordParameter("j_password").permitAll() 
        .and() 
       .csrf().disable() 

     } 
    } 
} 
+0

Non stai disabilitando csrf per tutte le richieste? – aProgrammer

+0

Non appena disabilito csrf per un url è disabilitato per tutti gli url – aProgrammer

+0

@amit Sì l'esempio precedente disabilita csrf per tutte le richieste, ma puoi rimuovere selettivamente l'esplicito 'csrf(). Disable()' dalla tua configurazione .Il mio esempio è la demo abilitare/disabilitare csrf per soap (che in genere ha un client non browser) e riposare (che di solito servono i client browser). –

5

IMHO, non v'è nulla di simile fuori dalla scatola. Quello che vorrei fare nel tuo caso, è di avere una gerarchia di URL per esempio radicata a /api che sarebbe esente da csrf. È facile da configurare. In XML di configurazione, si dispone di un normale <http> blocco compreso <csrf/>, basta duplicare e modificare primo blocco del genere

<http pattern="/api/**"> 
    ... 
    <!-- csrf --> 
</http> 

Come è prima, sarà attiva per ogni richiesta di /api gerarchia senza usare CSRF, e tutte le altre richieste lo useranno.

Nella parte normale dell'applicazione, non si utilizza mai l'url /api/** e si riservano a utilizzi diversi da browser.

Poi, nel vostro controller, li mappare sia alla loro URL normale e una copia sotto /api:

@Controller 
@RequestMapping({ "/rootcontrollerurl", "/api/rootcontrollerurl"}) 
class XController { 
    @RequestMapping(value = "/request_part_url", ...) 
    public ModelAndView method() { 
     ... 
    } 
} 

(ovviamente, rootcontrollerurl e request_part_url può essere vuoto ...)

Ma È necessario che analizzi l'implicazione della sicurezza di consentire richieste controllate non csrf ed eventualmente escludere i controllori dalla gerarchia /api.

+0

Grazie Serge, sono stato comunque in grado di trovare una soluzione per abilitare/disabilitare selettivamente CSRF, pubblicato la mia soluzione sopra. –

1

Ecco quello che ho usato per disabilitare la protezione CSRF su un endpoint specifico sul appconfig-security.xml aggiungere un nodo con le informazioni del vostro modello simile al seguente esempio:

<http security="none" pattern="/sku/*"/> 
<http security="none" pattern="/sku/*/*"/> 
<http security="none" pattern="/sku"/> 

Tieni presente che l'ordine è importante se utilizzi la mappa per tutte le richieste utilizzando il simbolo "*".

Problemi correlati