2015-11-16 2 views
2

Начиная с this статьи Я хочу написать небольшой скриптовый движок C# для работы. Я попробовал этот код:Roslyn Scripting - скрипт без «системы»

System.IO.StreamReader sr = new System.IO.StreamReader("example.txt"); 
var prog = sr.ReadToEnd(); 
sr.Close(); 
ScriptOptions so = ScriptOptions.Default; 
Console.WriteLine(CSharpScript.RunAsync(prog, so).Result.GetVariable("sum").Value); 
Console.ReadKey(); 

И содержимое файла example.txt является:

System.IO.StreamReader sr = new System.IO.StreamReader("foo.txt"); 
string s = sr.ReadToEnd(); 
int sum = System.Convert.ToInt32(s); 

Теперь я хочу, чтобы запретить пользователю только основные функции C# (с помощью INT, строка, в то время как , for) и некоторые самоопределяемые функции, но не всю библиотеку .NET. Но даже если я не включу ссылку System.IO, пользователь может набрать System.IO.something и получит правильное решение.

Есть ли возможность, чтобы удалить доступ к «Системе» из сценария?

Я рад любому ответу.

+0

Что вы подразумеваете под «** удалить доступ к« Системе »из сценария **"? –

+0

Нельзя использовать какой-либо элемент системы. Например. пользователь, который пишет сценарий, не может использовать System.IO.StreamReader, System.Convert или System.Threading.Thread вообще. – pBuch

+0

Вы хотите выполнить песочницу или отключить использование чего-либо в пространстве имен 'System'? Последнее может быть достигнуто путем анализа вашего входного кода и проверки пространства имен каждого символа. Первое можно сделать, загрузив код в отдельный домен приложения и указав разрешения домена приложения. – Tamas

ответ

1

Необходимо установить правильное значение ScriptingOptions, что означает, что вместо стандартного разрешения необходимо использовать пользовательский MetadataReferenceResolver, который автоматически разрешает отсутствующие ссылки. Я не знаю, есть ли уже резольвер, который решает только сборки на основе его параметров, но вы, безусловно, можете реализовать свои. Проверьте TestMetadataReferenceResolver, что делает что-то подобное.

Обновление Это не будет работать для вещей, определенных в mscorlib.

+0

Большое вам спасибо за помощь. Я реализовал свои собственные классы ScriptOptions и RuntimeMetadataReferenceResolver (удалив ключевое слово печати из исходных классов и наследуя от них) и сделал метод ResolveReference для возврата пустого объекта ImmutableArray. К сожалению, мое решение действует точно так же, как оригинальные ScriptOptions. Есть ли еще один момент, когда я должен что-то изменить? – pBuch

+0

Не могли бы вы предоставить нам код для проверки? Кроме того, я просто наткнулся на комментарий поверх ['ResolveMissingAssemblies'] (http://source.roslyn.io/#Microsoft.CodeAnalysis/MetadataReference/MetadataReferenceResolver.cs,cfee6ff1c43f8166), в котором говорится, что он влияет только на загрузку сборок явно не на которые ссылается компиляция. Было бы интересно проверить, что это за сборки. – Tamas

+1

Я проверил объект сценария, и по умолчанию он ссылается на mscorlib. Поэтому, возвращаясь к вашей первоначальной проблеме, вам, вероятно, нужно будет создать свою собственную компиляцию из кода и загрузить ее в свой собственный appdomain. Проверьте это (немного устаревшее) [доказательство концепции] (http://www.filipekberg.se/2011/12/08/hosted-execution-of-smaller-code-snippets-with-roslyn/) для песочницы ввода исходный код.И тогда вы можете указать 'IsolatedStorageFilePermission', чтобы разрешить использование частной виртуальной файловой системы. – Tamas

Смежные вопросы