C# 动态编译 安全吗
不是动态编译整个文件,是编译一段代码,类似于下面这种
public static string GenerateCode(string m_code)
{
StringBuilder sb = new StringBuilder();
sb.Append("using System;");
sb.Append(Environment.NewLine);
sb.Append("namespace DynamicCodeGenerate");
sb.Append(Environment.NewLine);
sb.Append("{");
sb.Append(" public class HelloWorld");
sb.Append(" {");
sb.Append(" public double OutPut()");
sb.Append(" {");
sb.Append(m_code); //此处输入一段代码m_code
sb.Append(" }");
sb.Append(" }");
sb.Append("}");
string code = sb.ToString();
return code;
}
主要过程就是,在程序窗口中输入一段代码,然后把代码存入 m_code ,然后动态编译,再在其他地方使用反射调用这段编译了的程序中的函数 OutPut() 。
我想问的是,在这种情况下,用户有没有可能输入一段恶意代码,从而对系统或者程序造成危害?
如果有的话,能不能举了例子,或者说说有没有预防的方法?
------解决方案--------------------这绝对的不安全啊,简单的弄个死循环就搞死你了。不过这需求很有意思啊,是要解决什么问题啊必须走这条路
------解决方案--------------------参考用栈实现四则运算器 这种没必要用这么复杂的过程
------解决方案--------------------C#四则运算的实现
------解决方案--------------------1.这玩意当然不安全
2.其实类似功能的项目在codeplex 和codeproject上多的是根本不用自己搞,在这两个地方搜索"MathParse"(或者"math expression")就可以找到一堆可以用的玩意
3.如果自己开发实际上也并不复杂,使用一些词法分析工具,解出语法树,按语法树调用对应方法即可。可以 用的玩意antlr,irony,yacc,lex等等
4.也可以借用第三方语言引擎,比如我个人经常借用ironpython,luainterface等做附加的解释引擎。
ps:如果你的要求不是很复杂的话,使用建议第2种方式完成,这些开源的东西在常规功能支持上基本是可以满意的
http://www.codeplex.com/site/search?query=mathparse&ac=8
http://www.codeproject.com/search.aspx?q=mathparse&doctypeid=1%3b2%3b3