2

我了解沙盒模式会阻止 Microsoft 认为“不安全”的表达式。这些表达式可以包装在 VBA 代码中以绕过沙箱。但是有什么好处呢?仅仅是您可以在代码中提供某种验证吗?我特意说的是表达式Environ("username")

我已经设置了一个在控件中使用上述表达式的测试应用程序,当沙盒模式打开时,该表达式被显式阻止,但是,我已经将表达式包装在 VBA 代码中以及模块中 - 这不受 VBA 的影响。

VBA 代码比控制表达式更安全吗?我很难找到如何利用控件中的表达式,使用 VBA 代码是否更安全?为什么或者为什么不?

4

1 回答 1

2

沙盒模式是一种针对 Jet/ACE 引擎的通用安全措施,可防止应用程序(包括 Access 和使用该引擎读取/写入 MDB 和 ACCDB 数据库(以及 Excel 文件)的任何其他应用程序)使用 Jet/ACE 作为表示运行不安全的表达式。

例如,对环境变量的访问可能允许读取敏感信息(如用户名)并更改其他信息(如 PATH)。

沙盒模式是一种默认的安全措施,可防止所有使用 Jet/ACE 数据库引擎的应用程序运行这些任意且具有潜在危险的命令。

信任与沙盒

请注意,沙盒模式与Trust不同:沙盒只关注通过 Jet/Ace 数据库引擎解释的项目,而不是 VBA。

另一方面,信任将确保默认情况下始终禁用 Access 应用程序,从而禁用 ActiveX、VBA 等,除非该应用程序从受信任的位置(文件夹)运行。

当您在受信任位置之外打开数据库时(例如,在您的Download文件夹或桌面上从 Internet 下载的数据库),它会出现一个黄色的大警告,表示所有活动内容已被禁用。
用户在评估安全风险后需要单击该按钮以临时启用应用程序。

所以信任只是关于启用/禁用应用程序中的活动内容。沙盒是一个额外的(独立的)层,默认情况下始终处于打开状态,并防止“危险”操作通过数据库引擎运行。

绕过沙箱

大多数受信任的应用程序无需离开沙箱。

如果你需要访问一些敏感的操作,一旦你的应用程序是可信的,你可以使用 VBA 来代替。
没关系,因为用户会通过在打开应用程序时单击警告或从注册的受信任位置运行它来明确允许它。

如果应用程序确实需要在沙箱外运行来执行不安全的表达式,您必须首先更改SandboxMode注册表项,然后从受信任的位置运行您的应用程序(或对您的应用程序进行数字签名)。

要更改注册表项,用户帐户需要能够修改它(普通用户只有读取权限)。

所以想法是要禁用沙盒模式,您需要以机器管理员身份登录并修改该注册表项。这不是你可以偶然做的事情!

登记处

如果您真的想禁用沙盒模式(您可能不应该),您会在(或在运行 32 位 Office 的 64 位操作系统上)找到SandboxMode密钥,并且密钥的有效值为:HKLM\Software\Microsoft\Office\14.0\Access Connectivity Engine\Engines\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines

  • 0 沙盒模式始终处于禁用状态。
  • 1 沙盒模式用于 Access,但不适用于非 Access 程序。
  • 2 沙盒模式用于非 Access 程序,但不适用于 Access。
  • 3 始终使用沙盒模式。这是安装 Access 时设置的默认值。

结论

我认为主要的想法是确保分层的一组安全默认值:

  • Office 的普通安装将确保默认情况下您无法打开和运行不安全的代码(数据库不受信任)
  • 沙盒模式可防止应用程序(包括 Access)在任何情况下通过 Jet/Ace 数据库引擎运行不安全的命令。
  • 您仍然拥有所需的灵活性,但它需要跳过几个确定的环节才能正常工作(以管理员身份修改注册表)。大多数应用程序应该回避的东西。

微软可能认为这是一种通过使运行不安全命令变得困难来促使开发人员在使用数据库引擎时仅使用安全表达式的一种方式。

于 2013-07-30T05:16:47.993 回答