При написании программ на ABAP, следующая методология известна мне как «выход» из программы, поэтому я выбираю имена соответственно.
Предположим, вы, в .Net,
1) определить интерфейс
namespace Exits {
public interface Exit {
int exitMethod(string s); // signature serves as example only
}
}
2) предоставить пользователю вашего приложения способ передать имя написанной пользователем сборки ExitImplementation.dll
и имя класса, скажем myClass : exit
, реализуя интерфейс выхода, к вашему приложению.Например, в качестве параметров командной строки или в некоторой форме.
Вы сохраняете имя пользовательской сборки в string assemblyName
и имя класса (включая пространство имен) в string theImplementation
, а затем загружаете его и выполняете его:
3)
Assembly assembly = Assembly.LoadFrom(assemblyName);
// assuming assembly is deployed by user into folder where application resides
Exit theExitImplementation = assembly.CreateInstance(theImplementation) as Exit;
int k = theExitImplementation.exitMethod("whatever");
(Первый вопрос, имеющий второстепенное значение: у этой техники есть имя за пределами мира ABAP, и как она называется? :-))
Что я хотел бы знать, так это какой риск вы берете, позволяя вашему приложению выполнять этот код пользователя (извините, если это наивный вопрос, я все еще новичок в .Net).Допустим, вывод - это только некоторый код сообщения, необходимый для определения вывода сообщения в некоторый журнал.
Предположим, что в качестве сценария развертывания какая-то компания использует приложение для ведения своего бизнеса, а какой-то сотрудник этой компании пишет выходную реализацию.Если этот сотрудник хочет нанести ущерб, что может быть под угрозой:
- ничего, кроме неправильного сообщения в журнале?
- содержимое экземпляров класса приложения?
- ресурсов ПК, на котором работает приложение?
- хуже?
У меня сложилось впечатление, что ответ 4. не так ли?myClass получает возможность выполнения и, следовательно, может в основном делать то, что может делать любое приложение, которое было запущено пользователем, который запускает исходное приложение.Есть ли способы предотвратить это?
Если так: имеет ли какое-то значение (если да, то что), что сигнатура выхода фиксирована и что вход в метод не может быть изменен в методе?Этот метод намеренно не позволяет динамически определять тип.
Этот метод, также намеренно, позволяет только ввод, который не может быть изменен.Предположим, строковый аргумент заменен другим типом, который вызывающий может изменить, например, StringBuilder.Увеличивает ли это риск?
Существуют ли более сложные (стандартные) методы для снижения риска при таком подходе?Есть ли альтернативные подходы?