9

Sto cercando di implementare protezioni contro gli attacchi CSRF nella mia API, che ho sviluppato utilizzando GAE Endpoint con oAuth2 richiesto per tutti i metodi.CSRF su GAE Endpoint con oAuth

Prima di implementare una protezione specifica, sto provando a interrompere la mia app (la CSRF sembrava semplice a prima vista). Ma proprio non può farlo funzionare.

Quando faccio riferimento al mio endpoint in un'altra pagina, il browser aggiunge le informazioni sui cookie ma non l'intestazione Autorizzazione con il token di accesso al portatore. Questo non sembra essere sufficiente, poiché i miei endpoint restituiscono automaticamente 401 con un'intestazione www-authenticate:Bearer realm="https://accounts.google.com/".

Come ho già detto, non ho una protezione specifica contro CSRF. Ma l'utilizzo di Google Cloud Endpoint con oAuth2 sotto HTTPS mi garantisce la protezione da questo tipo di attacco "gratuitamente"?

- modifica per affrontare commento

Ho provato un semplice attacco CSRF. Ho ottenuto una pagina con un <img src="https://bla-bla-bla-appspot.com/_ah/api/myapi/v1/resource.getMethod">. Poi ho avuto accesso a questa pagina mentre avevo la mia app aperta in un'altra scheda, quindi il mio browser avrebbe inviato le mie informazioni di autenticazione. E invia il cookie, ma non il mio token oAuth).

Non ho nemmeno provato a fare un POST, se ho "hackerato" un GET sarebbe già grandioso.

+0

Non sono sicuro se hai visto [questo] (http://stackoverflow.com/questions/16688489/cloud-endpoints-csrf-protection) e l'articolo che è legato nei commenti, ma sembra (se ho capito bene) che con OAuth2 CSRF non è un problema. Potrei sbagliarmi comunque, se trovi qualche risposta altrove, per favore condividi (; – Sasxa

+0

Cosa vuoi dire concretamente con "Quando faccio riferimento al mio endpoint in un'altra pagina, il browser aggiunge le informazioni sui cookie ma non l'intestazione Autorizzazione con l'accesso al portatore token "? Puoi mostrare il codice? – Nick

risposta

2

OAUth 2.0 explicitly protects against CSRF tramite l'uso di un parametro di stato non ipotizzabile che viene generato dal client e convalidato dal server. Anche se un utente malintenzionato fosse in grado di indurre un cliente a visitare un URL per autorizzare un token dannoso, il parametro dello stato non corrisponderebbe a quello del client e la richiesta verrebbe negata.

Le librerie Google Cloud Endpoints gestiscono questo bit delle specifiche OAuth per te, quindi sei al sicuro.

Oauth2 richiede che tutte le richieste abbiano il token di accesso al portatore come intestazione HTTP (utilizzare XMLhttpRequest da javascript per impostare l'intestazione e effettuare la richiesta) o come parametro di query URL (access_token). Un utente malintenzionato non conoscerà questo valore segreto, quindi non sarebbe in grado di creare un URL che supererebbe la convalida.

+0

Il link che hai fornito riguarda gli attacchi CSRF contro il server di autorizzazione OAuth, ma il token OAuth2 protegge il mio server app contro tali attacchi? –

0

Ecco (spero) utile snippet java dal mio Kuoll remote debugger per applicazioni web.

package com.kuoll.server.filters; 

import javax.servlet.*; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 

public class CrossOriginFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse resp = (HttpServletResponse) response; 

     resp.addHeader("Access-Control-Allow-Origin", "*"); 
     resp.setHeader("Access-Control-Allow-Methods", "POST, OPTIONS"); 
     resp.setHeader("Access-Control-Allow-Headers", "origin, content-type, accept"); 

     chain.doFilter(request, response); 
    } 

    @Override 
    public void init(FilterConfig filterConfig) throws ServletException { 
    } 

    @Override 
    public void destroy() { 
    } 

} 

Sostituire * in resp.addHeader("Access-Control-Allow-Origin", "*"); al tuo Origin (se necessario).

web.xml

<filter-mapping> 
    <filter-name>CrossOriginFilter</filter-name> 
    <url-pattern>/api/*</url-pattern> 
</filter-mapping> 
+0

L'impostazione delle intestazioni in Filtro non funziona in App Engine .. Ma in ogni caso, non hai detto nulla sulla CSRF ... come ho detto, sto cercando come rompere la mia app prima di implementare ciecamente qualsiasi correzione (o la prova che sono effettivamente già protetto). Ma grazie –