不是动态编译整个文件,是编译一段代码,类似于下面这种
 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() 。
我想问的是,在这种情况下,用户有没有可能输入一段恶意代码,从而对系统或者程序造成危害?如果有的话,能不能举了例子,或者说说有没有预防的方法?

解决方案 »

  1.   

    你看看excel怎么实现的 ,基本上都是自己定义一种语言 
      

  2.   


    这种四则运算  如果再加入 if else 这种判断功能  容易吗
      

  3.   

    如果你还需要大小于符号也很简单 毕竟对于大小于返回值就是个bool 你可以利用大于小于符号将算式分割 两边分别求四则运算的结果 然后再进行大小比较
      

  4.   


    不是大于小于的问题   是if else  
    就是说我先计算出一个值  然后通过判断这个值的大小,例如
    如果大于200 ,参数c=200
    如果小于100,参数c=300
    如果大于100小于200,参数c=50
    ...
    然后再接着计算(接下来的计算过程中可能还有判断过程)这种情况下  感觉四则运算扩充起来有点麻烦
      

  5.   

    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
      

  6.   

    如果在代码输入和动态编译之间加入一个安全检测环节能不能避免掉风险???例如,我设定在输入的代码中只能出现以下几种字符串:1、参数名称
    2、+ - *  / = ( ) { } ;
    3、if else
    4、乘方、开方等函数
    5、自己定义的函数名称,(在其他地方定义,在这个函数中调用)如果出现其他未知的字符串,则直接判断为非法,不进行动态编译。
    刚才在看yacc和lex,感觉似懂非懂的— —||