IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JavaScript Discussion :

Sécurité lors de l'upload d'un fichier JS


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2
    Par défaut Sécurité lors de l'upload d'un fichier JS
    Salut,

    Ma question est relativement simple, la solution peut être moins ^^

    Y'a t-il un problème de sécurité pour notre site et serveur web lorsque l'on autorise un utilisateur à envoyer un fichier JS et que celui-ci sera exécuté sur notre site à l'intérieur d'une balise iframe ?

    Comme je me doute que la réponse est OUI, je me demande quelles sont les solutions possibles pour "isoler" le code uploadé et faire en sorte qu'il ne soit pas nuisible au reste du site, que ce soit à cause d'un bug, d'une interférence avec le JS déjà présent ou bien entendu d'un code intentionnellement "malicieux".

    Peut être que ce sujet a déjà été traité ici, si c'est le cas veuillez m'en excuser et pouvez vous m'indiquer les liens concernés ?

    Bonne fêtes à tous

  2. #2
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Ta question est intéressante. Évidemment ça pose un gros problème de sécurité de permettre à un utilisateur d’injecter sur ton site du code qui sera ensuite exécuté sur d’autres clients. Iframe ou pas.

    Si j’étais à ta place, mon premier réflexe serait de forcer une extension .txt à tous les scripts provenant de l’utilisateur, pour s’assurer qu’ils ne seront jamais servis avec le type MIME d’un script, et donc jamais exécutés accidentellement.

    Ensuite, au moment de l’exécution, il est nécessaire de faire une analyse statique du code avant de l’exécuter, pour repérer l’utilisation de techniques « à risque ». Malheureusement il y a une multitude de façons de camoufler du code malicieux (fais une recherche avec « obfuscation »), et il est probablement impossible de se prémunir contre tous les risques.

    Si malgré ça tu veux continuer, en premier lieu il faudra bannir eval qui permet l’exécution d’absolument n’importe quoi, et String.fromCharCode qui est de loin la technique la plus utilisée pour décoder du code obfusqué.

    Et là encore il y a un malheureusement, car en JS on peut appeler des méthodes de différentes manières :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    String.fromCharCode()
     
    String['fromCharCode']()
     
    String['from' + 'Char' + 'Code']()
     
    var machin = String;
    var bidule = 'fromageMode'.replace('ageM', 'CharC');
    machin[bidule]()
    Je pense que tu vois l’idée.

    Il y a un grand nombre de choses à considérer, entre autres :
    • les méthodes .call, .apply et .bind des fonctions, qui permettent à l’attaquant de changer le contexte d’exécution d’une fonction, et donc de sortir de ton environnement contrôlé ;
    • les différentes utilisations de location et de tout ce qui utilise des URI car l’attaquant peut utiliser des URI data:, des blobs ou autre technologie permettant de faire exécuter du script de façon indirecte ;
    • les éléments DOM (script, img, a, object, embed, iframe, canvas, audio, etc.) qui utilisent également des URI – et il y a tout un tas de manières de créer du DOM, que ce soit avec document.createElement ou les constructeurs préconçus comme new Image(), ou encore en référençant un élement existant et en manipulant son innerHTML, etc. ;
    • setTimeout et setInterval qui, un peu de la même manière que les méthodes de fonctions, permettent de sortir de l’environnement contrôlé ;
    • et sans doute encore beaucoup d’autres choses que j’ignore (des ajouts spécifiques à un navigateur) ou auxquelles je ne pense pas sur le moment.


    La morale de tout ça c’est qu’il est probablement impossible de restreindre JavaScript à un sous-ensemble sécurisé ; et que même si tu y arrivais, ce sous-ensemble risquerait d’être très incomplet et de ne pas permettre grand chose à tes utilisateurs.

    En fait, je pense qu’il y a 95 % de chances que tu sois parti dans une mauvaise direction en voulant laisser la possibilité à tes utilisateurs d’écrire du code JavaScript.

    Peux-tu nous expliquer pourquoi tu penses avoir besoin de faire ça ? Il y a sans doute une meilleure solution.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2
    Par défaut
    Merci @Watilin pour cette réponse détaillée, même si elle n'est pas très encourageante ^^
    J'y reviendrais sûrement car elle contient pas mal d'infos...

    Il est vrai que j'avais espoir qu'il soit possible de "restreindre JavaScript à un sous-ensemble sécurisé" grâce à une méthode approuvée ou une librairie conçue dans ce but.

    Pour ce qui est du contexte, il s'agirait d'héberger des jeux développés en langage web, donc du html5+javascript.

  4. #4
    Expert confirmé
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Par défaut
    Sur les sites qui hébergent du HTML5 comme Newgrounds ou ArmorGames, il me semble que les fichiers sont soumis à une vérification manuelle. Je ne suis pas sûr, mais en tout cas c’est ce que je ferais. Un peu comme les extensions sur addons.mozilla.org. On n’a pas encore trouvé mieux qu’un être humain pour repérer une mauvaise intention dans un code.

    Tu peux exiger des développeurs qu’ils n’obfusquent pas leur code ; en revanche, ils peuvent vouloir le minifier (ce n’est pas la même chose), dans ce cas demande-leur le code source en leur expliquant que tu ne le diffuseras pas en public.
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

Discussions similaires

  1. Problème lors de l'upload d'un fichier
    Par ghir_ana dans le forum Langage
    Réponses: 1
    Dernier message: 21/08/2011, 12h53
  2. Problème lors de l'upload d'un fichier
    Par youtpout978 dans le forum ASP.NET
    Réponses: 7
    Dernier message: 29/07/2011, 14h28
  3. [Wamp] Oter le message d'erreur généré par wamp lors de l'upload d'un fichier
    Par sarah65536 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 19/05/2009, 13h39
  4. Erreur lors de l'upload d'un fichier par formulaire
    Par loukoum82 dans le forum Tomcat et TomEE
    Réponses: 2
    Dernier message: 06/10/2008, 09h45
  5. Réponses: 5
    Dernier message: 12/09/2006, 00h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo