Jeton CSRF nécessaire lors de l'utilisation de Apatrides(= Sessionless) d'Authentification?
Est-il nécessaire d'utiliser une Protection CSRF lorsque l'application s'appuie sur apatrides d'authentification (en utilisant quelque chose comme HMAC)?
Exemple:
-
Nous avons une page unique application (sinon il faut ajouter le jeton sur chaque lien:
<a href="...?token=xyz">...</a>
. -
Que l'utilisateur s'authentifie lui-même à l'aide de
POST /auth
. Sur la réussite de l'authentification, le serveur sera de retour quelques jeton. -
Le jeton sera stocké via JavaScript dans une variable à l'intérieur de la single page app.
-
Ce jeton sera utilisé pour restreindre l'accès des URLs comme
/admin
. -
Le jeton sera toujours transmis à l'intérieur des en-Têtes HTTP.
-
Il n'y a PAS de Session Http, et PAS de Cookies.
Comme je le comprends, il devrait(?!) pas de possibilité d'utiliser de la croix des attaques du site, parce que le navigateur ne permet pas de stocker le jeton, et ne peut donc pas automatiquement de l'envoyer au serveur (c'est ce qui allait se passer lors de l'utilisation de Cookies de Session).
Suis-je raté quelque chose?
- Soyez prudent à propos de l'Authentification Basique. De nombreux navigateurs enverra automatiquement le basic auth-têtes pour le reste de la session. Cela peut rendre l'authentification basique comme vulnérables à la CSRF comme cookie d'authentification.
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé quelques informations sur CSRF + à l'aide de pas cookies à des fins d'authentification:
https://auth0.com/blog/2014/01/07/angularjs-authentication-with-cookies-vs-token/
"puisque vous n'êtes pas en s'appuyant sur les cookies, vous n'avez pas besoin de les protéger contre les demandes de site"
http://angular-tips.com/blog/2014/05/json-web-tokens-introduction/
"Si nous descendons les cookies façon, vous avez vraiment besoin de faire CSRF pour éviter les demandes de site. C'est quelque chose que l'on peut oublier lors de l'utilisation de JWT comme vous le verrez."
(JWT = Json Web Jeton, un Jeton d'authentification basée sur les pour les apatrides apps)
http://www.jamesward.com/2013/05/13/securing-single-page-apps-and-rest-services
"La meilleure façon de faire de l'authentification sans risquer de vulnérabilités CSRF est simplement d'éviter d'utiliser des cookies afin d'identifier l'utilisateur"
http://sitr.us/2011/08/26/cookies-are-bad-for-you.html
"Le plus gros problème avec CSRF est que les cookies permettent absolument pas de défense contre ce type d'attaque. Si vous utilisez l'authentification par cookie, vous devez également employer des mesures supplémentaires pour protéger contre les CSRF. La plupart des mesures de précaution de base que vous pouvez prendre est de s'assurer que votre application ne soit jamais effectue les effets secondaires, en réponse à des demandes."
Il y a beaucoup plus de pages, qui stipulent que vous n'avez pas besoin de toute la protection CSRF, si vous n'avez pas l'utilisation de cookies à des fins d'authentification. Bien sûr, vous pouvez toujours utiliser des cookies pour tout le reste, mais éviter tout ranger, comme
session_id
à l'intérieur.Si vous avez besoin de se rappeler à l'utilisateur, il y a 2 options:
localStorage
: Un navigateur key-value store. Les données stockées seront disponibles même après que l'utilisateur ferme la fenêtre du navigateur. Les données ne sont pas accessibles par d'autres sites, chaque site obtient son propre espace de stockage.sessionStorage
: Également un navigateur de banque de données. La différence est là: Les données est supprimé lorsque l'utilisateur ferme la fenêtre du navigateur. Mais il est toujours utile, si votre webapp se compose de plusieurs pages. Ainsi, vous pouvez effectuer les opérations suivantes:sessionStorage
sessionStorage
sessionStorage
ou attendre pour l'utilisateur de fermer la fenêtre du navigateur, ce qui effacera toutes les données stockées.(pour avoir un coup d'oeil ici: http://www.w3schools.com/html/html5_webstorage.asp )
Existe-il des normes officielles pour le jeton d'authentification?
JWT (Json Web Jeton): je pense que c'est encore un projet, mais il est déjà utilisé par de nombreuses personnes et le concept a l'air simple et sécurisée. (IETF: http://tools.ietf.org/html/draft-ietf-oauth-json-web-token-25 )
Il y a aussi des bibliothèques pour beaucoup de cadre disponibles. Juste google pour elle!
http://.../someRestResource?method=POST
. Il est donc essentiel d'unGET
demande, mais l'Application Serveur interprète comme unPOST
demande, parce qu'il a été configuré pour utiliser lemethod
paramètre au lieu de l'en-tête HTTP....
Concernant les navigateurs web courants, il s'agit d'appliquer la Même Origine Politique et ne s'exécuteraGET
requêtes à des serveurs étrangers. Bien qu'il pourrait être possible d'exécuterPOST
demandes de si le navigateur web ne s'applique pas à ceux des standards web (bug, les logiciels malveillants).Server Side App
: Il n'est toujours pas possible d'envoyer un Corps de Requête, car les navigateurs ne le permettrons pas. Toutefois, si l'Application Serveur qui permetmethod=POST
, elle pourrait aussi permettrebody={someJson}
pour remplacer la valeur par défaut du corps de la requête. C'est vraiment de la mauvaise conception d'API et extrêmement risqué. Bien que si votre Serveur d'Application permethttp://...?method=POST&body={someJson}
vous devriez vraiment overthink ce que vous avez fait et pourquoi, et si c'est nécessaire. (Je dirais dans 99,9999% des cas, il est pas nécessaire). En outre, les navigateurs ne peut envoyer que quelques kilo-octets de cette façon.TL;DR
Un JWT, si elle est utilisée sans les Cookies, nie la nécessité pour un jeton CSRF - MAIS! par le stockage de JWT dans la session/localStorage, votre exposer votre JWT et l'identité de l'utilisateur si votre site a une vulnérabilité XSS (assez commun). Il est préférable d'ajouter un
csrfToken
clé de JWT et stocker les JWT dans un cookie avecsecure
ethttp-only
attributs définis.Lire cet article avec une bonne description pour plus d'info
https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage
De sorte que vous aurez besoin de stocker les csrfToken dans localStorage/sessionStorage ainsi que dans le JWT lui-même (qui est stocké dans un http seule et cookie de sécurité). Ensuite pour la protection csrf, vérifiez que le jeton csrf dans le JWT correspond à l'soumis csrf token-tête.