2009-10-18 5 views
2

Un ensemble d'objets prédéfini doit être agrégé dans un nouvel objet. Cependant, je veux que les utilisateurs spécifient une fonction personnalisée pour cela.Autoriser un script défini par l'utilisateur dans l'application Ruby/Rails

Maintenant, l'approche naïve serait

def foo; end 

objects = [1,2,3] 
# result = eval(user_script) 
result = eval("objects.inject {|sum, n| sum + n }") 

Ce que je évidemment ne veux pas faire! J'ai lu environ $SAFE = 4 (voir here), mais je ne suis pas sûr que cela suffise. Surtout parce que le script défini par l'utilisateur sera toujours en mesure d'appeler d'autres fonctions comme foo. Je veux seulement autoriser l'accès à des fonctions de base de Ruby non dangereuses.

Existe-t-il des fonctionnalités permettant à Ruby d'exécuter en toute sécurité des scripts définis par l'utilisateur? Je n'ai pas besoin d'être une syntaxe Ruby. Ce serait bien, cependant.

Répondre

2

Avez-vous vu le plugin safemode de Sven Fuch (overview here)? Voici le page chez GitHub. Au lieu de mettre en liste noire des méthodes dangereuses, ce que fait $ SAFE, il analyse le code entrant et supprime toute méthode qui ne figure pas sur une liste blanche. Le plugin est livré avec une liste blanche prédéfinie qui peut être vu dans this file.

Personnellement, je n'ai jamais utilisé ce plugin mais l'auteur est actif dans la communauté Ruby et je suis sûr qu'il répondrait à toutes vos questions.

+0

C'est génial! Difficile de trouver de telles choses dans le rubyverse. –

0

La meilleure serrure au monde ne vous empêchera pas d'être cambriolée si vous choisissez de donner la clé à tout le monde.

+0

En effet, c'est pourquoi je donne seulement aux modérateurs le droit d'ajouter un tel code. –

Questions connexes