从字节数组运行程序而不创建临时文件。 C#
我有许多存储在IIS服务器(MSSQL)上的.exe文件,其中包含报告和对服务器上文件的访问权限。 (这些文件将在星期日更改。)
连接到SQL Server并选择.exe文件后,我正在下载(在SQL中选择),现在我有一个分配给变量的字节数组。 我无法在未知目录中创建像“temp.exe”这样的临时文件,因为我知道有很多方法可以理解新创建的文件目录和…
这是不安全的,因为我的用户是专业的,如果他们中的一个知道这些方式……
所以,我想知道是否可以从字节数组运行.exe文件(默认为从“Windows资源管理器”运行)而不创建临时文件?
tnx update:exe文件是.net和Manager将上传新文件或更改文件。
请注意,您对任何额外安全性的信念都是虚幻的。 如果用户有权访问机器来读取文件,他们也可以读取进程的内存。
但是,要回答您的问题,您要求做的事情很简单并在此处进行描述: 加载EXE文件并从内存中运行它 。
实质上,您执行以下操作:
- 将您的字节数组传递给
Assembly.Load
以创建新的Assembly
。 - 使用
EntryPoint
属性读取该程序集的入口点。 - 使用
Assembly.CreateInstance
创建实例,并在该实例上调用该方法。
代码如下所示:
Assembly a = Assembly.Load(bytes); MethodInfo method = a.EntryPoint; if (method != null) method.Invoke(a.CreateInstance(method.Name), null);
听起来不安全,为什么你要在db中存储exécutables? 谁上传了他们? 他们在文件系统上是否存在,如果是恶意的话他们就像危险一样危险。
那些.net是吗? 如果是这样,您可以将程序集加载到具有安全限制的子appdomain中,我很确定您可以在不复制到磁盘的情况下执行此操作。
对于常规本机exe,我认为只有在没有物理文件支持的情况下才能启动exe(即使在任务管理器中,您也可以看到启动程序的路径)
这里有两个不同的安全问题:
- 有人可以看到您从数据库中下载的文件。
- 执行该文件可能是一个安全威胁。
首先要考虑的问题:在服务器上创建一个目录并限制对该目录的访问,这样除了运行服务器程序的用户帐户之外,没有人可以查看/使用它。 将字节数组保存到该目录中的临时文件中,执行它,并在进程完成后删除临时文件。
第二个问题:您需要在沙盒环境中运行该可执行文件。 在.NET中,您可以通过将代码加载到您已设置为仅具有部分信任的单独AppDomain中,在沙盒环境中运行代码。 如何做到这一点值得另一个问题。