【发布时间】:2011-07-17 18:24:05
【问题描述】:
我正在开发一个网站,用户可以在该网站上针对浏览器文本区域中的问题实施 C# 代码解决方案并将其提交。然后,服务器将编译该代码以及我在服务器上提供的预定义接口。将其视为一种策略设计模式;我提供一个策略界面,用户实现它。所以我需要在运行时一起编译一个字符串和一个预定义的 *.cs 文件。这是我现在只编译字符串部分的代码:
CodeDomProvider codeProvider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters parameters = new CompilerParameters();
parameters.OutputAssembly = "CodeOutputTest.dll"; // need to name this dynamically. where to store it?
parameters.GenerateExecutable = false;
parameters.IncludeDebugInformation = false;
CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, request.Code);
用户会提交如下内容:
public class UserClass : IStrategy
{
public string ExecuteSolution(string input)
{
// user code
}
}
抛开安全问题不谈(这又是一个沉重的问题)...如何将它与我的预定义接口 *.cs 文件一起编译?还是有更好的处理方法?
谢谢!
【问题讨论】:
-
除非您有充分的理由信任所有用户,否则我强烈建议您首先考虑安全问题。如果您确定没有办法安全地解决问题,那么确定如何解决问题就没有什么意义了。
-
出于安全问题,我建议在它自己的 AppDomain 中运行。这也将允许您在构建程序集后“卸载”程序集。根据您的数量,您最终可能会在内存中保存成百上千/更多的程序集。
-
@TheSean,我不确定在另一个 AppDomain 中运行代码会增加多少安全性。 在部分信任下在另一个 AppDomain 中运行它。
-
是的,这里的安全性绝对是一个问题。但是通过一些研究,我认为我应该能够以几乎没有任何特权的用户身份运行代码。我注意到 CompilerParameters 对象上的一些属性,例如 Evidence 或 UserToken 属性,它们可能有助于限制授予代码的访问权限。
-
嘿 jturinetti,你做到了吗?我需要实现一些非常相似的东西。
标签: c# .net compiler-construction dynamic compilation