日期:2014-05-18  浏览次数:20770 次

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