Office 解决方案的特定安全注意事项

利用 Microsoft .NET Framework 和 Microsoft Office 提供的安全功能,可以帮助保护您的 Office 解决方案免受可能的安全威胁。 本主题介绍其中一些威胁,并提供可帮助抵御这些威胁的建议。 它还包括有关 Microsoft Office 安全设置如何影响 Office 解决方案的信息。

**适用于:**本主题中的信息适用于 Microsoft Office 2010 和 2007 Microsoft Office system 的文档级项目和应用程序级项目。有关更多信息,请参见按 Office 应用程序和项目类型提供的功能

受信任的代码在新的恶意文档中被改变用途

攻击者可能会得到用于特定目的(例如,从求职信中下载个人信息)的受信任代码,并在其他文档(如工作表)中重新使用这些代码。 代码不知道原始文档并未运行,因此,当不同的用户打开文档时,可能会带来其他威胁(如泄漏个人信息或使用增强的特权执行代码)。 或者,攻击者可以简单地在工作表中修改数据,这样,当文档发送给受害者时,将发生异常行为。 通过更改链接到代码的工作表的值、公式或表现特征并将经过修改的文件发送给其他用户,恶意用户有可能攻击这些用户。 另外,用户还可能通过修改工作表中的值来访问他们不应看到的信息。

  • 由于程序集位置和文档位置都必须具有足够的证据才能执行,所以并不容易发起这种攻击。 例如,电子邮件附件中的文档或不受信任的 Intranet 服务器就没有足够的权限运行。

  • 要进行这种攻击,在编写代码本身时必须使代码决策基于特定的数据,而这些数据有可能是不受信任的。 创建具有包含数据库服务器名称的隐藏单元格的工作表就是一个示例。 用户将工作表提交给 ASPX 页,而后者尝试使用 SQL 身份验证和硬编码的 SA 密码连接该服务器。 攻击者可使用不同的计算机名称替换隐藏单元格的内容,并获取 SA 密码。 若要避免此问题,请不要对密码进行硬编码,并且在访问服务器前始终对照好的服务器内部列表检查服务器 ID。

建议

  • 始终验证输入和数据,不管它是来自用户、文档、数据库、Web 服务还是其他任何来源。

  • 公开特定类型的功能时要小心,如代表用户获取特权数据并将其置于不受保护的工作表中。

  • 根据应用程序类型的不同,在执行任何代码前验证原始文档是否正在运行可能是有意义的(例如,验证代码是否是从存储在已知的安全位置的文档运行)。

  • 如果应用程序执行任何特权操作,在打开文档时最好显示警告信息。 例如,可以创建一个启动屏幕或启动对话框,告诉用户应用程序将访问个人信息,并让用户选择是继续操作还是取消操作。 如果最终用户从一个表面上无害的文档中得到了这样的警告,他(或她)将能够在发生危及安全的事情前退出应用程序。

代码被 Outlook 对象模型保护阻止

Microsoft Office 可以限制代码使用对象模型中的某些属性、方法和对象。 Outlook 通过限制访问这些对象,来防止电子邮件蠕虫和病毒恶意地使用对象模型。 此安全功能称为 Outlook 对象模型保护。 启用对象模型保护时,如果外接程序尝试使用受限的属性或方法,Outlook 会显示安全警告,使用户可以停止操作,或者使用户可以授予在有限时段内访问该属性或方法的权限。 如果用户停止操作,则使用 Visual Studio Tools for Office 创建的 Outlook 外接程序将引发 COMException

根据 Outlook 是否与 Microsoft Exchange Server 一起使用,对象模型保护对外接程序的影响有所不同:

  • 如果 Outlook 未与 Exchange 一起使用,管理员可以对计算机上的所有外接程序启用或禁用对象模型保护。

  • 如果 Outlook 与 Exchange 一起使用,管理员既可以对计算机上的所有外接程序启用或禁用对象模型保护,也可以指定某些外接程序可以绕过对象模型保护运行。 管理员还可以针对对象模型的某些区域来修改对象模型保护的行为。 例如,即使已启用对象模型保护,管理员也可以自动允许外接程序以编程方式发送电子邮件。

Outlook 2007 更改了对象模型保护的行为,以改善开发人员和用户体验,同时帮助确保 Outlook 的安全性。 有关更多信息,请参见 Code Security Changes in Outlook 2007(Outlook 2007 中的代码安全性更改)。

将对象模型保护警告减至最少

为避免在使用受限的属性和方法时出现安全警告,请确保外接程序从您的项目中的 ThisAddIn 类的 Application 字段中获取 Outlook 对象。 有关此字段的更多信息,请参见应用程序级外接程序编程

只有从此对象中获取的 Outlook 对象才会受到对象模型保护的信任。 相反,从新的 Microsoft.Office.Interop.Outlook.Application 对象获取的对象不受信任,如果启用对象模型保护,受限的属性和方法将引发安全警告。

下面的代码示例演示启用了对象模型保护时的安全警告。 Microsoft.Office.Interop.Outlook.MailItem 类的 To 属性受对象模型保护的限制。 Microsoft.Office.Interop.Outlook.MailItem 对象不受信任,因为代码从使用 new 运算符创建的 Microsoft.Office.Interop.Outlook.Application 中获取它,而不是从 Application 字段中获取它。

Private Sub UntrustedCode()
    Dim application As New Microsoft.Office.Interop.Outlook.Application
    Dim mailItem1 As Microsoft.Office.Interop.Outlook.MailItem = _
        TryCast(application.CreateItem( _
        Microsoft.Office.Interop.Outlook.OlItemType.olMailItem),  _
        Microsoft.Office.Interop.Outlook.MailItem)
    mailItem1.To = "someone@example.com"
    MessageBox.Show(mailItem1.To)
End Sub
private void UntrustedCode()
{
    Microsoft.Office.Interop.Outlook.Application application =
        new Microsoft.Office.Interop.Outlook.Application();
    Microsoft.Office.Interop.Outlook.MailItem mailItem1 =
        application.CreateItem(
        Microsoft.Office.Interop.Outlook.OlItemType.olMailItem) as
        Microsoft.Office.Interop.Outlook.MailItem;
    mailItem1.To = "someone@example.com";
    MessageBox.Show(mailItem1.To);
}

下面的代码示例演示如何使用受对象模型保护信任的 Microsoft.Office.Interop.Outlook.MailItem 对象的受限 To 属性。 代码使用受信任的 Application 字段来获取 Microsoft.Office.Interop.Outlook.MailItem

Private Sub TrustedCode()
    Dim mailItem1 As Microsoft.Office.Interop.Outlook.MailItem = _
        TryCast(Me.Application.CreateItem( _
        Microsoft.Office.Interop.Outlook.OlItemType.olMailItem),  _
        Microsoft.Office.Interop.Outlook.MailItem)
    mailItem1.To = "someone@example.com"
    MessageBox.Show(mailItem1.To)
End Sub
private void TrustedCode()
{
    Microsoft.Office.Interop.Outlook.MailItem mailItem1 =
        this.Application.CreateItem(
        Microsoft.Office.Interop.Outlook.OlItemType.olMailItem) as
        Microsoft.Office.Interop.Outlook.MailItem;
    mailItem1.To = "someone@example.com";
    MessageBox.Show(mailItem1.To);
}

提示

如果 Outlook 与 Exchange 一起使用,则从 ThisAddIn.Application 获取所有 Outlook 对象不保证您的外接程序能够访问整个 Outlook 对象模型。 例如,如果 Exchange 管理员将 Outlook 设置为自动拒绝所有尝试使用 Outlook 对象模型来访问地址信息的操作,则即使先前的代码示例使用受信任的 ThisAddIn.Application 字段,Outlook 也不会允许该代码示例访问 To 属性。

指定在使用 Exchange 时信任哪些外接程序

当 Outlook 与 Exchange 一起使用时,管理员可以指定某些外接程序可绕过对象模型保护运行。 使用 Visual Studio Tools for Office 创建的 Outlook 外接程序无法单独获得信任,它们只能以组的形式获得信任。

Outlook 根据外接程序入口点 DLL 的哈希代码来信任外接程序。 所有面向 Visual Studio Tools for Office Runtime 的 Outlook 外接程序都使用相同的入口点 DLL (VSTOLoader.dll)。 这意味着如果管理员信任面向 Visual Studio Tools for Office Runtime 的任何外接程序运行以使其绕过对象模型保护运行,则也将信任面向 Visual Studio Tools for Office Runtime 的所有其他外接程序。 有关信任特定外接程序以使其在运行时不受对象模型保护影响的更多信息,请参见 Specify the method Outlook uses to manage virus prevention features(指定 Outlook 用来管理病毒防护功能的方法)。

权限更改不立即生效

如果管理员调整了文档或程序集的权限,则用户必须退出并重新启动所有 Office 应用程序,这些更改才能生效。

其他承载 Microsoft Office 应用程序的应用程序也会阻止实施新的权限。 当安全策略改变时,用户应当退出所有使用 Office 的应用程序(无论是寄宿的还是独立的)。

Microsoft Office System 中的“信任中心”设置不会影响外接程序或文档级自定义项

用户可以通过在**“信任中心”**设置选项来禁止加载外接程序。 但是,使用 Visual Studio Tools for Office 创建的应用程序级外接程序和文档级自定义项不会受到这些信任设置的影响。

如果用户通过使用**“信任中心”**来禁止加载外接程序,则以下类型的外接程序将不会加载:

  • 托管和非托管的 COM 外接程序。

  • 托管和非托管的智能标记。

  • 托管和非托管的智能文档。

  • 托管和非托管的自动化外接程序。

  • 托管和非托管的实时数据组件。

提示

在 Excel 2010 和 Word 2010 中已弃用智能标记。 有关更多信息,请参见智能标记概述

以下过程描述如何在 2007 Microsoft Office system 中使用**“信任中心”**来限制加载外接程序。 这些过程不影响使用 Visual Studio Tools for Office 创建的外接程序或自定义项。

在 Microsoft Office 2010 应用程序、Excel 2007、PowerPoint 2007 或 Word 2007 中禁用外接程序

  1. 单击**“文件”选项卡(对于 Microsoft Office 2010 应用程序)或“Microsoft Office 按钮”**(对于 2007 Microsoft Office 应用程序)。

  2. 单击“应用程序名称 **选项”**按钮。

  3. 在类别窗格中单击**“信任中心”**。

  4. 在详细信息窗格中单击**“信任中心设置”**。

  5. 在类别窗格中,单击**“加载项”**。

  6. 在详细信息窗格中,选中**“要求受信任的发布者签署应用程序加载项”“禁用所有应用程序加载项”**。

在 InfoPath 2007、Outlook 2007、Project 2007 或 Visio 2007 中禁用外接程序

  1. 在**“工具”菜单上,单击“信任中心”**。

  2. 在类别窗格中单击**“宏设置”**。

  3. 在详细信息窗格中,选中**“不提供警告,禁用所有宏”“为签署的宏提供警告;禁用所有未经签署的宏”**。

  4. 在类别窗格中,单击**“加载项”**。

  5. 在详细信息窗格中,选中**“将宏安全性设置应用于已安装的加载项”**。

请参见

其他资源

保护 Office 解决方案的安全