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