Come condividere il token CSRF all'applicazione client?

4

Ho due diverse applicazioni web. L'app web di servizi ha definito i servizi REST. L'app Web del cliente ha pagine JSP che effettuano chiamate ai servizi REST utilizzando Ajax per ottenere i dati e visualizzarli nell'interfaccia utente. Voglio implementare OWASP CSRF Gaurd 3 per i miei servizi REST.

Come posso ottenere il valore del token CSRF nell'applicazione Client in modo che possa passare il valore del token come intestazione e i servizi di riposo vengono convalidati ed eseguiti?

Consentitemi di dire chiaramente la mia architettura. Progetto di servizi - Si tratta di un progetto Spring / JPA con servizi web REST definiti. Questo progetto richiede di essere protetto con CSRF. Il suo contesto web è / Servizi. Quindi url potrebbe essere in localhost come http://localhost:8080/Services/RESTSERVICE

Progetto client - È un progetto JSP / Servlet con pagine web jsp / html. Questo progetto effettua chiamate AJAX ai servizi REST del progetto Servizi per recuperare i dati e mostrarli nell'interfaccia utente. L'URL è come http://localhost:8080/Client/index.jsp

Ora il mio dubbio è se implemento CSRF Guard in Services Project, progetto client richiesto token CSRF per chiamare i servizi REST protetti. Come posso ottenere questo valore del token nelle pagine jsp dei progetti del cliente?

Ho provato ad aggiungere cookie alla risposta dei servizi di restituzione, ma il javascript del Cliente non è in grado di leggerlo, quindi con i cookie non ero in grado di condividere il token con il client. C'è qualche altro approccio? Qualsiasi aiuto sarà apprezzato ...

    
posta MShah 08.10.2013 - 11:41
fonte

4 risposte

2

Implementa solo un endpoint /token che fornisce un token CSRF con un cookie di sessione. Ricorda, se il lato client JS su un dominio diverso non può recuperare e usarlo per costruire richieste (la maggior parte del client che JS può fare è disassociarlo in un iframe isolato), CSRF non è possibile. Consenti all'app client di recuperare il token tramite CORS se i domini differiscono.

    
risposta data 08.10.2013 - 13:41
fonte
0

Recentemente ho dovuto fare questo e ho finito per mettere il token CSRF in una variabile javascript globale. Poi, quando effettuerei le mie chiamate, includerei questo token come parametro. Dal momento che un utente malintenzionato non è in grado di leggere alcun stato dal tuo browser, dovrebbe essere al sicuro lì.

Esempio:

$.ajax({
  type: "POST",
  url: "some.php",
  data: { name: "John", location: "Boston", _csrf: _GLOBALS._csrf }
});
    
risposta data 08.10.2013 - 16:51
fonte
0

Ho affrontato lo stesso problema e ho deciso di utilizzare "richieste di token una tantum". Qualcosa del genere:

  1. Inserisci login-password, autenticati, autorizza, carica la pagina principale del progetto
  2. Chiama il metodo /csrf-token prima di qualsiasi altra richiesta, ad es. durante la fase iniziale di bootstrap
    • Il server genera token e quindi da qualche parte nei dati della sessione server prende atto che il token csrf è già stato richiesto, quindi tutte le chiamate future di /csrf-token avranno esito negativo.
  3. Il cliente ricorda quel token e lo usa per tutte le future richieste; per esempio, potrebbe ricordare in alcuni spazi dei nomi JavaScript, quindi sarà accessibile solo da quella pagina / scheda.

Svantaggio principale di questo metodo: devi firmare se ad esempio ricarichi la pagina.

    
risposta data 17.12.2013 - 09:25
fonte
0

Aggiunta del token CSRF nel client

pom.xml:

<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>js-cookie</artifactId>
    <version>2.1.0</version>
</dependency>

Importalo in HTML:

<script type="text/javascript" src="/webjars/js-cookie/js.cookie.js"></script>

quindi possiamo usare i metodi di utilizzo dei cookie in xhr:

$.ajaxSetup({
beforeSend : function(xhr, settings) {    
      xhr.setRequestHeader("X-XSRF-TOKEN",
          Cookies.get('XSRF-TOKEN'));
    }
  }
}
});

fonte: link

    
risposta data 28.04.2018 - 13:48
fonte

Leggi altre domande sui tag