不是动态编译整个文件,是编译一段代码,类似于下面这种
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() 。
我想问的是,在这种情况下,用户有没有可能输入一段恶意代码,从而对系统或者程序造成危害?如果有的话,能不能举了例子,或者说说有没有预防的方法?
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() 。
我想问的是,在这种情况下,用户有没有可能输入一段恶意代码,从而对系统或者程序造成危害?如果有的话,能不能举了例子,或者说说有没有预防的方法?
这种四则运算 如果再加入 if else 这种判断功能 容易吗
不是大于小于的问题 是if else
就是说我先计算出一个值 然后通过判断这个值的大小,例如
如果大于200 ,参数c=200
如果小于100,参数c=300
如果大于100小于200,参数c=50
...
然后再接着计算(接下来的计算过程中可能还有判断过程)这种情况下 感觉四则运算扩充起来有点麻烦
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
2、+ - * / = ( ) { } ;
3、if else
4、乘方、开方等函数
5、自己定义的函数名称,(在其他地方定义,在这个函数中调用)如果出现其他未知的字符串,则直接判断为非法,不进行动态编译。
刚才在看yacc和lex,感觉似懂非懂的— —||