75 votes

Sécurité CORS avec les applications mobiles

Nous devons maintenir la sécurité de notre serveur API avec la restriction CORS :

Access-Control-Allow-Origin : http://myonlinesite.com

Mais nous avons également besoin que cette API soit accessible pour nos applications mobiles (Android+iOs).

Toutes les solutions que j'ai trouvées me disent d'autoriser toutes les origines : * mais cela constituerait un gros défaut de sécurité pour notre API.

Nous construisons nos applications avec Cordova, dont le WebView sert des fichiers locaux et envoie donc des fichiers : origin: null pour toutes ses requêtes http(s). Nous envisageons donc d'ajouter null à l'origine autorisée. C'est mieux, car cela bloquera tout autre site web tentant de récupérer notre API, mais cela permettra à toute application mobile de la récupérer...

Existe-t-il une solution plus intéressante pour cela ?

Merci !

0 votes

Je doute que vous puissiez définir null pour l'origine ? Même en conservant origin:*, il existe plusieurs moyens/API qui peuvent être utilisés pour protéger votre API.

1 votes

Je me débats avec le même problème. Avez-vous trouvé comment procéder correctement ?

37voto

sideshowbarker Points 29042

Nous envisageons donc d'ajouter null à l'origine autorisée. C'est mieux, car cela bloquera tout autre site web tentant de récupérer notre API, mais cela permettra à toute application mobile de la récupérer...

Si vous faites ça, vous autorisez les requêtes du code JavaScript qui s'exécute à partir de tout une origine non-http/https, ce qui inclut toute personne exécutant quelque chose à partir d'une file:// ou même data: URL.

Ainsi, si vous utilisez une politique CORS restrictive pour des raisons de "sécurité", l'envoi de réponses avec un nom de fichier Access-Control-Allow-Origin: null L'en-tête semble être une assez mauvaise idée.


Nous avons besoin de maintenir la sécurité de notre serveur API avec une restriction CORS : Toutes les solutions que j'ai trouvées me disent d'autoriser toutes les origines : * mais cela constituerait un gros défaut de sécurité pour notre API.

Vous n'expliquez pas pourquoi vous avez déterminé qu'il s'agirait d'un échec de sécurité ou pourquoi vous devez avoir une politique CORS restrictive. Mais à moins que (1) votre serveur Web fonctionne dans un intranet ou derrière un autre type de pare-feu, et (2) que l'accès aux ressources soit autrement limité uniquement par l'authentification IP, alors vous ne gagnez rien à utiliser une politique CORS restrictive. Pour citer la spécification :

Configuration de base du protocole CORS sécurisé

Pour les ressources dont les données sont protégées par une authentification IP ou un pare-feu (ce qui est malheureusement encore relativement courant), l'utilisation du protocole CORS n'est pas sûre. (C'est la raison pour laquelle le protocole CORS a dû être inventé).

En revanche, l'utilisation de l'en-tête suivant est sans danger :

Access-Control-Allow-Origin: *

Même si une ressource expose des informations supplémentaires basées sur un cookie ou une authentification HTTP, l'utilisation de l'en-tête ci-dessus ne les révélera pas. Il partagera la ressource avec des API telles que XMLHttpRequest comme il est déjà partagé avec curl et wget .

Ainsi, en d'autres termes, si une ressource n'est pas accessible à partir d'un appareil aléatoire connecté au web à l'aide de curl et wget l'en-tête susmentionné ne doit pas être inclus. Toutefois, s'il est possible d'y accéder, il est parfaitement possible de le faire.

2 votes

Merci pour votre réponse. En effet, file:// et data:// sont autorisés mais cela empêche toujours les autres sites d'envoyer des requêtes à notre API. Et la raison pour laquelle nous avons besoin de cette sécurité est encore une fois : empêcher les scripts malveillants dans les sites web envoyant des requêtes massives. Nous avons donc besoin de la restriction CORS, mais n'est-ce pas le but de CORS ? Je veux dire, ce n'est pas une sécurité du tout d'accepter * comme origine autorisée, non ?

21 votes

Si votre API est accessible au public, vous autorisez déjà essentiellement les demandes provenant de n'importe où, car tous les outils autres que les navigateurs peuvent y envoyer autant de demandes qu'ils le souhaitent. La seule chose que vous limitez est donc les navigateurs. CORS ne m'empêche pas d'écrire un script shell malveillant utilisant curl ou autre pour envoyer des requêtes massives à votre API. Ou d'exécuter ce script depuis N machines différentes sur un botnet. Etc. Donc, si votre plus grande préoccupation est d'obtenir des nombres massifs de demandes, CORS n'est pas vraiment efficace du tout pour atténuer cela.

0 votes

Mauvais conseil ; nous avons ce problème, et permettre à n'importe quel site web de faire des références croisées avec nos vidéos exclusives de clients (vidéos de solutions d'un jeu télévisé) n'est pas possible, car il s'agit de licences réservées à nos clients ; nous ne nous soucions pas d'un contexte natif/script, car CORS ne protège pas contre cela de toute façon Nous nous soucions de sites web tiers malveillants (lire : publics facilement accessibles) qui exploitent notre bande passante ou même qui établissent des liens vers ces vidéos, et c'est l'un des cas d'utilisation pour lesquels CORS a été conçu, et la raison pour laquelle l'approche webview-in-app est désavantagée, sans l'option Access-Control-Allow-Origin : null.

3voto

Comme indiqué dans la réponse de sideshowbarker, l'utilisation de Access-Control-Allow-Origin: null ne peut être considérée comme sûre si l'application peut être ouverte dans le contexte d'un navigateur. En revanche, il n'y a pas de risque de sécurité pour une application qui s'exécute dans sa propre vue web dédiée.

La politique de la même origine (que CORS étend) est conçue pour un type spécifique de menace : un script d'un domaine étranger, s'exécutant dans le navigateur, envoyant une requête à votre serveur qui inclut vos cookies d'autorisation. Mais si vous exécutez votre application dans un serveur dédié à l'application WKWebView alors il n'y aura pas de scripts étrangers capables de faire une demande à votre serveur en utilisant vos cookies.

0 votes

Merci pour votre réponse, nous allons implémenter "null" pour le moment, et voir si nous trouvons une solution de contournement entre-temps.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X