2010-10-18 14 views
5

Je voudrais implémenter un langage de script pour aider à automatiser partiellement certaines tâches sur un wiki public. Je ne peux pas installer quelque chose comme Google Caja sur le serveur ou modifier le logiciel wiki lui-même, mais je peux installer du code JavaScript pour l'exécution côté client. Étant donné que mon intention est de permettre aux utilisateurs ordinaires de créer et de publier des scripts, l'utilisation de JavaScript n'est pas sûre et pourrait mener à des compromis de compte.Langage de script simple et sécurisé implémenté en JavaScript?

Une telle implémentation de langage de script existe-t-elle ou non, est-ce relativement facile à créer? Mon accent est mis sur la facilité de traitement de texte, les requêtes Ajax et la mise en œuvre.

Voici un exemple de tâche d'un script devrait effectuer, provenant Wikipedia's procedure for requesting article deletion:

  1. Demandez à l'utilisateur le nom d'une page wiki et une bonne raison de le supprimer.
  2. Obtenez le code source de cette page, ajoutez un avis de suppression en haut et enregistrez le nouveau texte.
  3. Créer une nouvelle page (son nom basé sur le nom de la première page) qui inclut la raison de la suppression.
  4. Obtenez la liste des utilisateurs qui ont édité la page et informez-en la première (encore une fois, en éditant une page spécifique) que la page qu'il a créé est sur le point d'être supprimée.
+0

Si vous voulez que cette langue soit à la fois capable de faire des requêtes ajax et d'accéder/modifier le DOM, vous ne gagnez pas de sécurité sur JS (si elle ne peut pas toucher le DOM, il n'y a pas de problème) – tobyodavies

+0

L'idée n'est pas de permettre une modification arbitraire du DOM ou des requêtes Ajax, mais seulement celles qui sont relativement "sûres" et qui peuvent être facilement annulées après que l'utilisateur a reçu une liste d'actions qui ont été effectuées. – PleaseStand

+0

Je ne comprends pas du tout. Qu'est-ce que ce "langage de script" est censé pouvoir faire? – Pointy

Répondre

3

Voici une implémentation de Tcl en javascript: Tcl in Javascript.

Voici la source: tcl.js.

et le code est ici une mise en œuvre console en direct dans votre navigateur pour jouer avec: A little tcl.js console

Tcl peut ne pas être votre tasse de thé, mais la mise en œuvre semble assez simple et directe. C'est principalement parce que tcl est un langage si simple. Vous pouvez l'utiliser pour obtenir des idées sur la façon d'implémenter des variables et des fonctions.

Indice: dans tcl, les structures de contrôle sont des fonctions donc regardez où les fonctions intégrées sont implémentées pour voir l'implémentation de for, while et foreach.

1

Vous pourriez juste bac à sable; c'est-à-dire, la portée dans un couple de variables clés de sorte que le code de l'utilisateur est incapable d'accéder aux objets dangereux. Cependant, autoriser le code utilisateur à effectuer des requêtes ajax est, en soi, intrinsèquement dangereux. Je reconsidérerais la santé mentale du projet si c'est ce qu'il faut.

+4

Pas assez bon. Pour les débutants, cela peut facilement être brisé en utilisant 'self' au lieu de window. De la façon dont JavaScript est, il serait extrêmement difficile de corriger tous les trous - voir http://code.google.com/p/google-caja/wiki/AttackVectors. – PleaseStand

2

Le ADsafe de Douglas Crockford est supposé être un sous-ensemble sécurisé de JavaScript.

Il se compose d'une bibliothèque d'exécution (~ 20 Ko minified) et d'un vérificateur (inclus dans JSLint). Si Crockford abandonnait "Le logiciel doit être utilisé pour le bien, pas le mal" de la licence, les deux composants seraient des logiciels open source compatibles avec la GPL.

Parce que JSLint est un programme JavaScript, il peut vérifier les scripts utilisateur entièrement dans le navigateur Web. Ceci est en contraste avec Google Caja, qui est écrit en Java.

+0

Adsafe ne semble pas faire quoi que ce soit à propos des boucles infinies ou imposer un délai, ce qui signifie qu'il est toujours possible pour un utilisateur de faire quelque chose comme 'for (;;);' et de verrouiller la page d'un autre utilisateur; ou quelque chose comme 'a = []; pour (;;) {a = [a, a]} 'pour une explosion de mémoire. –