C# 动态编译 安全吗

lrs001 2012-05-15 11:41:21
不是动态编译整个文件,是编译一段代码,类似于下面这种
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() 。


我想问的是,在这种情况下,用户有没有可能输入一段恶意代码,从而对系统或者程序造成危害?

如果有的话,能不能举了例子,或者说说有没有预防的方法?
...全文
261 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
lrs001 2012-05-15
  • 打赏
  • 举报
回复

就是让用户添加代码实现类似于上述的计算过程

不只是四则运算

还需要进行判断

图片我传到空间了,如果没显示的话,给可以去看
zincy 2012-05-15
  • 打赏
  • 举报
回复
四则运算比你动态编译好
lrs001 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
C#四则运算的实现
[/Quote]

这种四则运算 如果再加入 if else 这种判断功能 容易吗
xboxeer 2012-05-15
  • 打赏
  • 举报
回复
qq13833254607 2012-05-15
  • 打赏
  • 举报
回复
你看看excel怎么实现的 ,基本上都是自己定义一种语言
xboxeer 2012-05-15
  • 打赏
  • 举报
回复
参考用栈实现四则运算器 这种没必要用这么复杂的过程
[Quote=引用 4 楼 的回复:]
主要是想实现一个 用户自己定义计算过程的功能,就是 已知几个参数,然后用户自己定义计算过程(加、减、乘、除、大小判断等),最后获得另一个参数的值

这种功能有什么安全又简单方法吗
[/Quote]
lrs001 2012-05-15
  • 打赏
  • 举报
回复
主要是想实现一个 用户自己定义计算过程的功能,就是 已知几个参数,然后用户自己定义计算过程(加、减、乘、除、大小判断等),最后获得另一个参数的值

这种功能有什么安全又简单方法吗
qq13833254607 2012-05-15
  • 打赏
  • 举报
回复
这绝对的不安全啊,简单的弄个死循环就搞死你了。不过这需求很有意思啊,是要解决什么问题啊必须走这条路
NewUser2008 2012-05-15
  • 打赏
  • 举报
回复
没有绝对的安全。
test2050 2012-05-15
  • 打赏
  • 举报
回复
这个应该不安全。你又要让人家输入代码动态编译。又要让人家不能输入恶意代码。你如何判断是恶意代码。就像杀毒软件判断病毒一样麻烦。
lrs001 2012-05-15
  • 打赏
  • 举报
回复
如果在代码输入和动态编译之间加入一个安全检测环节能不能避免掉风险???

例如,我设定在输入的代码中只能出现以下几种字符串:

1、参数名称
2、+ - * / = ( ) { } ;
3、if else
4、乘方、开方等函数
5、自己定义的函数名称,(在其他地方定义,在这个函数中调用)

如果出现其他未知的字符串,则直接判断为非法,不进行动态编译。


刚才在看yacc和lex,感觉似懂非懂的— —||
黄瓜黄瓜 2012-05-15
  • 打赏
  • 举报
回复
自己定义一种语言,在转换。。。
xboxeer 2012-05-15
  • 打赏
  • 举报
回复
这样的需求你何必在去四则运算里面改?完全是外层再封装一层逻辑啊
[Quote=引用 14 楼 的回复:]
引用 13 楼 的回复:
如果你还需要大小于符号也很简单 毕竟对于大小于返回值就是个bool 你可以利用大于小于符号将算式分割 两边分别求四则运算的结果 然后再进行大小比较

引用 8 楼 的回复:
引用 7 楼 的回复:
C#四则运算的实现


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




不是大于小于的问题 是if else


就……
[/Quote]
wanghui0380 2012-05-15
  • 打赏
  • 举报
回复
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

lrs001 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
如果你还需要大小于符号也很简单 毕竟对于大小于返回值就是个bool 你可以利用大于小于符号将算式分割 两边分别求四则运算的结果 然后再进行大小比较

引用 8 楼 的回复:
引用 7 楼 的回复:
C#四则运算的实现


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



不是大于小于的问题 是if else


就是说我先计算出一个值 然后通过判断这个值的大小,例如
如果大于200 ,参数c=200
如果小于100,参数c=300
如果大于100小于200,参数c=50
...
然后再接着计算(接下来的计算过程中可能还有判断过程)

这种情况下 感觉四则运算扩充起来有点麻烦
xboxeer 2012-05-15
  • 打赏
  • 举报
回复
如果你还需要大小于符号也很简单 毕竟对于大小于返回值就是个bool 你可以利用大于小于符号将算式分割 两边分别求四则运算的结果 然后再进行大小比较
[Quote=引用 8 楼 的回复:]
引用 7 楼 的回复:
C#四则运算的实现


这种四则运算 如果再加入 if else 这种判断功能 容易吗
[/Quote]
lrs001 2012-05-15
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 的回复:]

那就写一个计算器放在上面,让用户看到的仅仅是页面 用户能输入的只是参数值,这样就安全了!
[/Quote]

主要是计算的过程也是不确定的,需要用户添加的。

这个功能的主要想法是:

在机械设计时,需要计算许多参数,这些参数的计算过程是已知的。如果通过编程手段把这些计算过程存起来,那下次设计时,只需要修改几个初始的参数值,就能重新获得一套新的数据,十分方便。

现在的想法是 把这个功能做成可扩充的而不是硬编码,让用户能根据不同的计算过程自行添加
laichunlin 2012-05-15
  • 打赏
  • 举报
回复
那就写一个计算器放在上面,让用户看到的仅仅是页面 用户能输入的只是参数值,这样就安全了!

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧