36 votes

Comment utiliser Javascript avec Rhino pour Java dans un bac à sable?

Le cadre de notre application java doit exécuter le javascript qui est écrit par des non-développeurs. Ces non-développeurs sont à l'aide de code javascript pour la mise en forme des données. (La Simple logique et de concaténation de chaîne pour la plupart).

Ma question est comment puis-je configurer l'exécution de ces scripts assurez-vous que les erreurs de script de ne pas avoir un impact négatif majeur sur le reste de l'application.

  • Besoin de se prémunir contre les boucles infinies
  • Se prémunir contre de nouvelles zones de frai des threads.
  • Limiter l'accès aux services et de l'environnement
    • Système de fichiers (Exemple: Si un mécontent, le scénariste a décidé de supprimer les fichiers)
    • Base de données (Même chose que de supprimer des enregistrements de base de données)

Essentiellement, j'ai besoin de configurer le javascript portée de n'inclure exactement ce dont ils ont besoin et pas plus.

20voto

Thilo Points 108673

Pour vous protéger contre les boucles infinies, vous pouvez observer le nombre d'instructions pendant l'exécution du script (cela ne fonctionne qu'avec les scripts interprétés, pas avec ceux compilés).

Dans Rhino JavaDocs, cet exemple empêche le script de s'exécuter pendant plus de dix secondes:

  protected void observeInstructionCount(Context cx, int instructionCount)
 {
     MyContext mcx = (MyContext)cx;
     long currentTime = System.currentTimeMillis();
     if (currentTime - mcx.startTime > 10*1000) {
         // More then 10 seconds from Context creation time:
         // it is time to stop the script.
         // Throw Error instance to ensure that script will never
         // get control back through catch or finally.
         throw new Error();
     }
 }
 

13voto

Sebastian Kübeck Points 131

Pour bloquer l'accès aux classes et méthodes Java, consultez ...

http://codeutopia.net/blog/2009/01/02/sandboxing-rhino-in-java/

10voto

Tom Hawtin - tackline Points 82671

Pour se prémunir contre les boucles infinies, vous auriez besoin de le mettre dans un processus séparé afin qu'il puisse être tué.

Pour se prémunir contre la création de threads, vous devez étendre SecurityManager (la valeur par défaut de mise en œuvre permet à du code non fiable à l'accès non-root thread groupes).

La sécurité de Java ne vous permet pas d'empêcher l'accès au système de fichiers.

Pour la base de données de restrictions, vous pourriez être en mesure d'utiliser le SQL standard de sécurité de l'utilisateur, mais c'est assez faible. Sinon, vous devez fournir une API qui met en œuvre vos restrictions.

Edit: je tiens à signaler que la version de Rhino fourni avec JDK6 a eu de la sécurité du travail fait sur elle, mais ne comprennent pas le compilateur.

1voto

Jason S Points 58434

Je viens de croiser ce billet de blog qui semble être utile pour plus ou moins de bacs à sable (pas seulement Rhino):

http://calumleslie.blogspot.com/2008/06/simple-jvm-sandboxing.html

-9voto

jliszka Points 102

Javascript est à thread unique et ne peut pas accéder au système de fichiers, donc je ne pense pas que vous ayez à vous en préoccuper. Je ne sais pas s'il existe un moyen de définir un délai d'expiration pour se protéger contre des boucles infinies, mais vous pouvez toujours créer un thread (Java) qui exécute le script, puis le tuer après tant de 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