2009-09-15 5 views
0

Nous avons une console de débogage d'administration dans notre application qui vous permet d'entrer un script et de le soumettre pour obtenir le résultat. Nous ne sommes pas préoccupés par les utilisateurs malveillants, mais voudrions empêcher les choses de base comme quelqu'un en entrant System.exit (1) juste pour voir ce qu'il fait. Malheureusement, l'ajout d'un fichier de politique de sécurité n'est pas une option. Existe-t-il un autre moyen de mettre en sandbox un script? Groovy est livré avec un gestionnaire de sécurité spécial pour cela.Prévenir System.exit dans une console Web Groovy sans fichier de politique de sécurité

+0

On dirait qu'il n'y a pas moyen d'y parvenir sans changer le directeur mondial de la sécurité ... Ce – noah

Répondre

3

J'ai regardé « NoExitSecurityManager » Groovy et trouvé qu'il fait exactement cela: System.exit interdisant() ... ce qui ne suffit pas. Ma solution créait ma propre classe "DisallowAllSecurityManager" qui étend SecurityManager et interdit tout ce dont un script n'a pas besoin, comme l'accès en écriture au système de fichiers ou la connexion à d'autres hôtes, en lançant SecurityException dans chaque méthode check .. Mais: Vous ne pouvez pas lancer une exception dans toutes les méthodes check ... Voici une liste de contrôle .. méthodes dont vous avez besoin pour permettre:

  • checkCreateClassLoader()
  • checkMemberAccess()
  • checkPackageAccess()
  • checkPermission()
  • checkPropertyAccess()
  • checkRead()

Lorsque vous souhaitez évaluer votre script Groovy vous peut le faire de la manière suivante, ce qui limite uniquement le script groovy:

SecurityManager securityManager = System.getSecurityManager(); 
try { 
System.setSecurityManager(new DisallowAllSecurityManager()); 
Object result = groovyShell.evaluate(expression); 
     ... 
} catch (...) { 
     ... 
} finally { 
     System.setSecurityManager(securityManager); 
} 
+0

Le seul problème avec cette réponse est que les autres threads que celui en cours sont également affectés (c'est-à-dire que leur gestionnaire de sécurité est remplacé), ce qui peut causer des problèmes de suivi. Néanmoins, il semble que ce soit la meilleure réponse possible, alors je l'accepte. – noah

3

Il suffit de le régler avant d'exécuter le script,

 System.setSecurityManager(new NoExitSecurityManager()); 
+1

est cool, mais je ne peux pas apporter de changements globaux à la JVM, et je dois seulement limiter la sécurité pour le script. – noah

Questions connexes