C# 如何防止访问本地文件系统

C# 如何防止访问本地文件系统,c#,security,acl,C#,Security,Acl,我的(C#)应用程序可以加载外部DLL(不是我写的)并从这些库中执行代码。这些库可以是C#或CPP 我需要确保此外部代码不会访问本地文件系统中的任何文件(读写),除非从特定文件夹访问 如何才能做到这一点?将应用程序作为受限用户帐户运行,并仅授予用户对该特定文件夹的访问权限。通过操作系统设施(文件系统priv)保护文件,创建一个只能访问这些文件的帐户,并使用此帐户运行应用程序这取决于您的框架,但是您可以使用(代码访问安全策略)到.NET 3.5(并且我认为C++ + DLL)来指定包括IO访问的安

我的(C#)应用程序可以加载外部DLL(不是我写的)并从这些库中执行代码。这些库可以是C#或CPP

我需要确保此外部代码不会访问本地文件系统中的任何文件(读写),除非从特定文件夹访问


如何才能做到这一点?

将应用程序作为受限用户帐户运行,并仅授予用户对该特定文件夹的访问权限。

通过操作系统设施(文件系统priv)保护文件,创建一个只能访问这些文件的帐户,并使用此帐户运行应用程序

这取决于您的框架,但是您可以使用(代码访问安全策略)到.NET 3.5(并且我认为C++ + DLL)来指定包括IO访问的安全特权。
希望这能有所帮助:)

我见过这样做的第三方代码;例如,允许您编写操纵CLR对象的JavaScript脚本,但它通过使用权限阻止任何源自JavaScript的代码路径访问文件系统、反射等

您可以阅读Jint的文档并浏览其源代码以了解更多详细信息,但其实质似乎是:

PermissionSet myPermissionSet = new PermissionSet(PermissionState.None);
// or some other permission set, depending on your requirements

try {
    myPermissionSet.PermitOnly();
    // run untrusted code
} finally {
    CodeAccessSecurity.RevertPermitOnly();
}

我读到的很多东西都说你需要创建一个沙盒Appdomain(这是我从来没有成功过的),但是Jint的方法似乎工作得很好。不过,您可能需要注意第三方代码挂钩静态事件,这些事件可能会在以后触发,然后它们可能会无限地逃出
范围。

看看Molebox,也许它会满足您的需要。Molebox允许您包装模块以对其进行沙箱处理

除了使用限制文件系统访问的用户帐户运行进程之外,您不能直接使用WiNAPI的本地C++代码,您称C是C还是CPP……它们总是被管理的LIBs吗?不可能在具有受限访问的模拟调用(登录用户API)中将调用封装到非托管代码中,因此,不必使用受限制的priv运行整个应用程序,而只需限制外部调用?@Hans事实并非如此。有用于沙盒通用代码的工具。这是一个很好的解决方案,但现在我有另一个问题-我必须能够从管理员用户连接到java进程创建的管道。我收到一个拒绝访问错误。请让管理员用户进程创建具有权限的管道,以允许受限用户访问它