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 :

Intégrer des bouts de scripts envoyés par les visiteurs


Sujet :

JavaScript

  1. #1
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut Intégrer des bouts de scripts envoyés par les visiteurs
    Bonjour,

    Je cherche à faire un forum dans lequel les utilisateurs peuvent utiliser certains éléments HTML pour la présentation. Ça ça marche bien.

    Mais je veux aussi leur permettre de scripter un comportement, par exemple utiliser un <canvas> et dessiner dessus.
    exemple d'un post :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Contemplez ce joli rond :
     
    <canvas id="canvas" width="640" height="480"/>
    <script>
    canvas = getCanvas('canvas');
    canvas.setColor('blue');
    canvas.fillCircle(320, 240, 20);
    </script>

    Ce qui aura pour effet de dessiner un disque bleu. Il y a d'autres fonctions pour réagir à un clic, faire des animations, déplacer des éléments, etc. Là on voit un appel à une nouvelle fonction getCanvas() qui renvoie une version minimisée d'un vrai contexte 2D d'un <canvas>.

    Si je fais entièrement confiance à mes utilisateurs, ou si c'est juste pour le staff, c'est tout simple, il n'y a pas de problème.
    Mais pour les autres, assez rapidement j'aurai quelque chose comme :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <script>
    document.getElementById('title').innerHtml = '<h1>Un élément de votre anatomie est toute petite !!!!!1!1!</h1>';
    </script>

    Ou pire. Surtout pire.
    Le problème : je ne veux pas qu'ils aient accès à 'document', 'getElementById()', ni aucune variable ou fonction du DOM (éventuellement aucune variable ou fonction que celles que je fournis.) S'ils font une boucle, je veux pouvoir surveiller son temps d'exécution et l'interrompre si elle exagère.

    Il y a une solution évidente en théorie, mais laborieuse en pratique : inventer un nouveau langage de script et l'implémenter en JavaScript. Et à la limite, ça pourrait juste être un sous-langage de JavaScript, implémenté en JavaScript.
    Mais je me demandais s'il n'existait pas déjà des technologies pour intégrer des scripts exécutables venant de visiteurs, en limitant drastiquement les possibilités de code malveillant.

    Je n'arrive pas à trouver de mot-clé qui décrive ce que je cherche, du coup mes recherches Google répondent à côté.

    Quelqu'un a-t-il entendu parler de quelque chose comme ça ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  2. #2
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    Tu peux intégrer le code dans une closure à l'intérieur de laquelle tu définis une variable document.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    var txt = 'document.getElementById("toto")';
    (function(doc){
        var document = null;
        try{eval(txt)}
        catch(e){
            alert('Erreur de script');
        }
        console.log(doc.getElementById("toto"))
    })(document)
    Enfin... c'est un début de piste sommaire, mais je pense qu'il est possible de démarrer par là.
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  3. #3
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Bonjour,

    Pourquoi ne pas utiliser une iframe, comme le font la plupart des sites de code collaboratif :
    http://jsdo.it
    http://jsfiddle.net
    One Web to rule them all

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    C'est ce que je fais pour l'instant, mais il reste assez facile de coder des abus, pop-ups, boucles infinies, sons au démarrage, surcharge mémoire etc.
    Dans les sites de code collaboratif ça ne semble pas bien grave, parce que celui qui fait ça ne pourrit que son propre espace, tant pis pour lui.

    Moi je parle de plusieurs intervenants dans la même page, ou dans le même contexte de navigation. Il y a pas mal de trucs désagréables qui seraient pourtant faciles à éviter en théorie, si on avait un contrôle total de la technologie.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Rédacteur/Modérateur

    Avatar de SylvainPV
    Profil pro
    Inscrit en
    Novembre 2012
    Messages
    3 375
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2012
    Messages : 3 375
    Points : 9 944
    Points
    9 944
    Par défaut
    Je ne vois pas comment tu veux permettre à des gens de coder sans qu'ils aient la possibilité de faire des boucles infinies ou des surcharges mémoire... Est-ce qu'il existe au moins un langage qui le permette ? C'est quoi le "contrôle total de la technologie" ?
    One Web to rule them all

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Eh bien, le JavaScript fourni par les navigateurs fait ça. Si un script exagère en temps d'exécution le navigateur le détecte et propose son arrêt. S'il surcharge la mémoire aussi. Le navigateur est fait en C, je suppose, donc C permet ça. En théorie je pourrais faire un navigateur en Java ou en Python, donc eux aussi.

    Moi, je souhaite avoir cette capacité, la différence étant que je ne suis pas navigateur qui accepte d'exécuter des scripts, mais site web qui accepte d'exécuter des scripts. Le navigateur a des moyens de neutraliser les scripts qui perturbent l'expérience utilisateur. Tout comme un navigateur peut le faire parce qu'il a inventé son propre moteur de scripts, un site web pourrait le faire en inventant son propre langage de script. Mais c'est peu pratique, alors que la couche au-dessus s'est déjà occupée du problème.

    Citation Envoyé par SylvainPV
    C'est quoi le "contrôle total de la technologie" ?
    Une vision idéale de la technologie de "scripts." Le JavaScript est une technologie offerte aux sites web, pour qu'ils s'en servent. Il est inclus avec un certain nombre de features, partant du principe qu'on veut toujours toutes ces features, parce que si on n'en veut pas, il suffit de pas s'en servir et on ne perd rien. Dans le cas où ce principe serait faux, qu'on cherche à supprimer ces features pour avoir accès à moins de choses, en théorie supprimer des features n'a rien de compliqué. Même chose sur le temps passé en exécution, sur la quantité de mémoire autorisée.

    Cela permettrait de faire comme l'OS fait pour exécuter des programmes tout en protégeant son bon fonctionnement. Comme le navigateur fait pour exécuter des scripts tout en protégeant son bon fonctionnement. En théorie rien n'empêcherait qu'un site web puisse exécuter des "scripts visiteurs" tout en protégeant son propre fonctionnement. C'est en pratique que c'est pas prévu, ça a pas été fait comme ça (ce qui simplifie sa définition, donc sa normalisation et son déploiement, certes.)
    Je comprends ce qui a mené à ce qu'on ait pas ça, mais dans la mesure où toute la technologie nécessaire a déjà été développée, on aurait pu l'avoir.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [MySQL] Selectionner des cases à cocher puis envoyer par e-mail
    Par antxbe dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 21/10/2008, 12h03
  2. Réponses: 10
    Dernier message: 30/01/2007, 15h29
  3. Réponses: 6
    Dernier message: 22/11/2006, 11h24
  4. Réponses: 2
    Dernier message: 18/04/2006, 10h44
  5. [MySQL] Modification des données d'une base par les membres
    Par pod1978 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 22/03/2006, 17h25

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