web-dev-qa-db-fra.com

Pourquoi les navigateurs interdisent-ils l'accès aux fichiers à partir du système de fichiers local même si le document HTML se trouve également sur le système de fichiers local?

De nombreux navigateurs ne vous permettent pas d'accéder aux fichiers du système de fichiers local avec JavaScript (même si le document HTML se trouve également sur le système de fichiers local).

( source )

Oui, je sais que la solution consiste à "installer et utiliser un serveur HTTP pour le développement local" mais je ne comprends pas pourquoi cela devrait être requis? Autoriser une page Web à accéder au système de fichiers local serait évidemment horrible, mais quels sont les risques d'accéder au système de fichiers local à partir du système de fichiers local?

Chaque fois que j'exécute un script Shell, je le fais et les scripts Shell ne m'empêchent pas d'exécuter cat. La façon dont je l'obtiens si j'exécute quelque chose à partir d'un système de fichiers local (que ce soit un exécutable arbitraire, un exécutable que j'ai compilé moi-même ou un script interprété, qui comprend un document HTML ou JS!) Je suis censé savoir ce que je suis en cours d'exécution. Pourquoi les scripts JS sont-ils exécutés dans un navigateur exempté de cette hypothèse? Si j'ai l'habitude d'exécuter négligemment des logiciels malveillants à partir d'un système de fichiers local, je peux facilement me foutre d'une multitude de façons autres que d'ouvrir un document HTML.

Aussi: CORS n'est-il pas censé interdire cross-Origin le chargement des ressources? À ma connaissance, demander une ressource de système de fichiers local à une ressource de système de fichiers locale n'est guère cross-Origin, c'est plutôt la même origine, donc je ne comprends pas pourquoi CORS se plaindrait.

En plus de cela, m'oblige-je à exécuter un serveur HTTP pour le développement local en améliorant quelque chose? Cela me demande d'ouvrir inutilement un port sur localhost. De toute évidence, cela peut être fait de manière à empêcher le monde extérieur de parler à mon serveur local (ne refuse-t-il pas assez les connexions entrantes?), Mais pourquoi ouvrir un port d'écoute si je n'ai pas à le faire?

Qu'est-ce que je ne comprends pas ici?

EDIT: Sur la deuxième pensée, je vois une raison. Les navigateurs permettent aux utilisateurs d'enregistrer une page Web localement. Il serait logique de pouvoir ouvrir une telle page Web d'une manière qui n'endommagera pas davantage le système local que de charger cette même page Web à partir d'Internet.

5
gaazkam

Je vais tirer un vieil article ici sur une attaque qui a utilisé des emplacements d'image connus sur les hôtes pour cartographier les réseaux pour les attaques (à partir de 2006):

https://www.cnet.com/news/javascript-opens-doors-to-browser-based-attacks/

Initialement, JavaScript avait beaucoup plus d'accès au système qu'aujourd'hui, mais au fil du temps, la valeur d'un agent javascript largement permissif a permis aux attaques d'avoir plus de visibilité sur le point final qu'elles ne l'auraient dû. Si vous autorisez votre navigateur à parcourir tous vos fichiers, vous donnez à votre attaquant la possibilité de lancer des logiciels malveillants à partir de votre navigateur même lorsque vous regardez des vidéos de chats apprivoisés. Oops.

À mesure que les systèmes progressent, j'imagine que JavaScript continuera de conserver un niveau d'accès assez restreint en raison des problèmes d'accès ouvert causés par le passé. Comme le dernier zeroday JavaScript annoncé sur Microsoft l'a démontré, c'est un gros problème qui oblige les entreprises à extraire les bibliothèques JavaScript avant qu'elles ne puissent être exécutées.

Maintenant, vous remarquerez que j'ai beaucoup concentré sur JavaScript et c'est à cause de JavaScript que c'est vraiment un problème. Le HTML est certainement bénin en soi, mais dès que vous ouvrez un bloc de script, vous avez ouvert une boîte de vers qui doivent être conservés.

Enfin, les raisons pour lesquelles les navigateurs ne prennent pas cela en charge à quelque titre que ce soit, car ce n'est pas une fonctionnalité dont vous avez vraiment besoin pour 99% de la population. Le navigateur Web n'est pas destiné à être un serveur Web et n'est qu'un client. L'intégration des fonctions de type serveur alourdirait les navigateurs, ce qui est la fonction opposée que tous les navigateurs tentent de mettre en œuvre (léger, rapide, anémique en termes de ressources)

Cela dit, avec le modèle de plus en plus ouvert pour les navigateurs (Microsoft adopte Chrome), je suppose que vous pourriez essayer d'écrire un module qui intègre cette fonctionnalité, et je suppose en outre qu'il y aurait des développeurs qui seraient heureux. Vous avez juste besoin de voir si ce créneau veut vraiment un serveur local qui ne nécessite pas d'installer Apache, iis ou nginx.

2
Connor Peoples

Si JavaScript dans une page HTML pouvait accéder au système de fichiers de contenu une fois ouvert sur le système de fichiers, il pourrait facilement télécharger ces données sur un serveur Web. Il suffit alors à un attaquant de tromper l'utilisateur pour qu'il ouvre un document HTML qui a été téléchargé, puis il dispose de vos données privées.

Fondamentalement, vous devez traiter le HTML comme potentiellement dangereux comme vous le feriez pour tout autre fichier exécutable. Ce serait un peu similaire à la façon dont .js les fichiers sont exécutables sous Windows, ce qui a été un problème récemment pour les utilisateurs de Windows.

En fait, cela devient un peu pire. Imaginez que certains éditeurs de logiciels majeurs incluent de la documentation d'aide dans un fichier HTML, qui présente une vulnérabilité XSS commune. Ensuite, un attaquant peut simplement rediriger le navigateur des utilisateurs vers cette page pour voler vos données. Les navigateurs modernes peuvent bloquer la redirection automatique, mais un attaquant pourrait inciter les utilisateurs à passer l'URL manuellement dans votre navigateur. Ensuite, même en entrant un fichier: l'URL dans votre navigateur peut être risquée.

0
Alexander O'Mara