Наше приложение анализирует и компилирует пользовательский ввод как код C#, и это вызывает некоторые проблемы с безопасностью. Обычно пользователь создает выражения, используя операторы и функции basi c arithmeti c из математической библиотеки. Однако также можно написать выражение, которое выполняет произвольный код, если оно возвращает ожидаемый тип.
ex. new System.Threading.Thread(<malicious code>).ManagedThreadId
Мы используем класс CSharpCompilation
вместе с методами stati c из SyntaxFactory
для компиляции выражений.
По сути, мне нужен какой-то способ ограничить то, что типы или методы, которые можно использовать в выражениях. Моей первой мыслью было использование подхода «черный список / белый список», но я не знаком с пространством имен CodeAnalysis и надеялся, что кто-то может указать мне правильное направление.
Было бы также здорово, если бы кто-то мог объяснить мне как приведенный выше пример успешно компилируется, если к экземпляру CSharpCompilation
не добавлена ссылка на System.Threading
?