none
请问如何保证动态生成的代码的运行安全? RRS feed

  • 问题

  • 在我的Asp.net网页中,我允许用户自己创建并运行代码,就像下面的代码一样,但是为了防止用户编辑恶意的代码访问磁盘、数据库,应该怎么做才能限制用户?
    谢谢!


    using System;
    using System.Reflection;
    using System.Globalization;
    using Microsoft.CSharp;
    using System.CodeDom;
    using System.CodeDom.Compiler;
    using System.Text;

    namespace ConsoleApplication1
    {
        public class Program
        {
            static void Main(string[] args)
            {
                //1.CSharpCodePrivoder
                CSharpCodeProvider objCSharpCodePrivoder = new CSharpCodeProvider();

                //2.CompilerParameters
                CompilerParameters objCompilerParameters = new CompilerParameters();
                objCompilerParameters.ReferencedAssemblies.Add("System.dll");
                objCompilerParameters.GenerateExecutable = false;
                objCompilerParameters.GenerateInMemory = true;

                //3.CompilerResults
                CompilerResults cr = objCSharpCodePrivoder.CompileAssemblyFromSource(objCompilerParameters, GenerateCode());

                if (cr.Errors.HasErrors)
                {
                    foreach (CompilerError err in cr.Errors)
                    {
                        Console.WriteLine(err.ErrorText);
                    }
                }
                else
                {
                    Assembly objAssembly = cr.CompiledAssembly;
                    object objHelloWorld = objAssembly.CreateInstance("DynamicCodeGenerate.HelloWorld");
                    MethodInfo objMI = objHelloWorld.GetType().GetMethod("OutPut");

                    Console.WriteLine(objMI.Invoke(objHelloWorld, null));
                }

                Console.ReadLine();
            }

            static string GenerateCode()
            {
                StringBuilder sb = new StringBuilder();
                sb.Append("using System;");
                sb.Append(Environment.NewLine);
                sb.Append("namespace DynamicCodeGenerate");
                sb.Append(Environment.NewLine);
                sb.Append("{");
                sb.Append(Environment.NewLine);
                sb.Append("    public class HelloWorld");
                sb.Append(Environment.NewLine);
                sb.Append("    {");
                sb.Append(Environment.NewLine);
                sb.Append("        public string OutPut()");
                sb.Append(Environment.NewLine);
                sb.Append("        {");
                sb.Append(Environment.NewLine);
                sb.Append("             return \"Hello world  cw!\";");
                sb.Append(Environment.NewLine);
                sb.Append("        }");
                sb.Append(Environment.NewLine);
                sb.Append("    }");
                sb.Append(Environment.NewLine);
                sb.Append("}");

                string code = sb.ToString();
                // Console.WriteLine(code);
                // Console.WriteLine();

                return code;
            }
        }
    }

    2010年4月26日 1:44

答案

  • 你可以在服务器上创建一个受限用户,再用这个用户启动不信任的程序。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年4月26日 16:59
    版主

全部回复

  • 你可以在服务器上创建一个受限用户,再用这个用户启动不信任的程序。

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年4月26日 16:59
    版主
  • 谢谢!

    我的asp.net程序将要求发布到远程主机上,请问如何创建一个受限用户为这个asp.net 程序

    2010年4月27日 5:06
  • 联系主机管理员

    The following is signature, not part of post
    Please mark the post answered your question as the answer, and mark other helpful posts as helpful.
    Visual C++ MVP
    2010年4月27日 12:05
    版主