IT 组织的示例代码接受清单

基于 Microsoft Office SharePoint Server 2007 的网站通常包括自定义解决方案。通过添加自定义解决方案来自定义网站的功能使 Office SharePoint Server 2007 变得更为强大和更具灵活性。但是,一个运行在 SharePoint 场中且设计不合理或未正确实现的可执行模块即使在目标 Web 应用程序的作用域之外也会造成损害。未正确实现的自定义解决方案可能会带来安全或性能风险,增加支持成本,使部署变得复杂化,并且还会降低工作效率。

由于在 SharePoint 服务器场中安装自定义解决方案的影响可能是正面的,也可能是负面的,因此我们建议您先仔细评估所有自定义解决方案,然后再将其部署到您的生产环境中。要评估的方面包括:

除了要求解决方案的开发与一般最佳方案一致外,我们还建议您让开发人员提交一份清单,以确定其解决方案已根据最佳方案进行了编码和测试。

为了帮助确保您部署的解决方案能够提供预期的好处而不会给企业带来不必要的风险,您可以使用下面的示例代码接受清单。将此列表作为您自己的清单的起始点来确保提交用于部署的解决方案的质量。除了提供开发解决方案之后的检查之外,您的代码接受清单还可以成为一个很好的培训工具。通过在开发人员实现其自定义设置之前为他们提供此列表,您可以告知开发人员您对他们将要开发和提交的解决方案的质量预期。

Important 重要说明:

此示例清单仅供参考,不能想当然地认为此清单包含全部代码接受问题,或认为不需要采取其他适用于贵组织的措施。此清单不提供任何明示或暗示的担保。

本主题内容:

SharePoint 开发的最佳方案资源

本节包含以下资源的列表,您可以将这些资源提供给开发人员,以帮助他们设计和实施能够满足 IT 对可用性、可支持性、性能和安全性要求的解决方案。

代码接受清单

本节按以下类别组织代码接受清单:安全性、会话管理、验证、敏感数据、异常处理、Web 部件、文档、一般的软件开发最佳方案。有关完整清单的可打印和可修改版本,请参阅代码接受清单的可打印版本 (https://go.microsoft.com/fwlink/?linkid=125134&clcid=0x804)。

备注

本文档中的清单是作为示例提供的,可根据企业的需要基于此清单来开发您自己的代码接受清单。应将其用作开发自己的清单的起始点。

安全性

代码接受清单的这一部分包含的建议项可帮助确保提交的用于在 SharePoint 环境中部署的解决方案是使用最佳安全方案开发的。

[ ]

应用程序使用包含列表(已知、有效和安全的输入),而不是排除列表(拒绝已知的恶意或危险输入)。

[ ]

所有用户输入在显示给客户端时都经过 IOSec 编码。

[ ]

字符编码由服务器设置(建议使用 ISO-8859-1)。

[ ]

纯文本密码不出现在 Web.config、Machine.config 或包含配置设置的任何文件中。将使用 Aspnet_setreg.exe 等实用工具以及 IIS 6.0 或 IIS 7.0 上 AppPool 中的信任项或标识设置来加密凭据。

[ ]

如果 Cookie 包含敏感数据,则被标记为安全。

[ ]

Web 部件和其他自定义项中的输入图面包括边界检查、输入数据完整性检查和适当的异常处理以防止跨站点脚本编写和 SQL 注入。

[ ]

该设计解决了潜在的规范化问题。

[ ]

应避免使用 AllowUnsafeUpdates,而是使用 ValidateFormDigest(),并在必要时使用提升的特权与 SharePoint 对象交互。在必须使用 AllowUnsafeUpdates 的情况下,请确保在 try-catch-finally 块中,将 AllowUnsafeUpdates 设置为 False 或使用 Dispose() 方法(根据 IDisposable 接口的要求),以避免出现安全问题。

会话管理

代码接受清单的这一部分包含的建议项可帮助确保提交的用于在 SharePoint 环境中部署的解决方案是使用管理会话最佳方案开发的。

[ ]

会话状态是强大的、不可预知且受保护的,以防未经授权的访问或重放攻击。

[ ]

会话生存期在最长 30 分钟的不活动状态后结束。

[ ]

会话标识符不在 URL 中传递,并且不使用 ASP.NET 功能(即无 Cookie 会话)。

[ ]

会话状态服务如果没有使用,则将被禁用。

验证

代码接受清单的这一部分包含的建议项可帮助确保提交的用于在 SharePoint 环境中部署的解决方案是使用验证输入最佳方案开发的。

[ ]

在所有识别的入口点(包括表单字段、查询字符串、Cookie、HTTP 标头和 Web 服务参数)应用输入验证。

[ ]

如有可能,启用 ASP.NET validateRequest 选项。

[ ]

验证数据的类型、长度、格式和范围。

[ ]

安全性不依赖于客户端验证,相反,验证是在服务器端执行的。

[ ]

应用程序始终使用标准化输入验证(如正则表达式)。

敏感数据

代码接受清单的这一部分包含的建议项可帮助确保提交的用于在 SharePoint 环境中部署的解决方案是使用保护敏感数据的最佳方案开发的。

[ ]

应用程序不以明文形式记录敏感数据。

[ ]

敏感数据不存储在 Cookie 中。

[ ]

敏感数据不存储在未加密的隐藏表单字段或查询字符串中。通过使用服务器端状态管理对这些数据进行维护。

[ ]

将使用 SSL、加密的 IPSEC 或传输前的应用程序层加密在传输过程中保护敏感数据。

[ ]

不缓存敏感数据。默认情况下关闭输出缓存。

[ ]

通过电子邮件传输的敏感数据使用 S/MIME 加密或信息版权管理 (IRM),具体取决于预期收件人。

异常处理

代码接受清单的这一部分包含的建议项可帮助确保提交的用于在 SharePoint 环境中部署的解决方案是使用异常处理最佳方案开发的。

[ ]

应用程序始终使用标准化方法进行结构化的错误和异常处理。

[ ]

错误处理代码继承自 SPException 类以保持 SharePoint 错误外观的一致性。

[ ]

应用程序在发生错误和异常时会安全地失败。

[ ]

异常条件不允许用户绕过安全检查来运行特权代码。

[ ]

应用程序会向客户端返回常规自定义错误消息。

[ ]

代码使用异常处理,它仅捕获您知道的异常。例如,除非再次引发错误,否则不要使用 try{} catch(Exception ex){}

[ ]

如果代码使用异常筛选器,则筛选器执行顺序将没有影响(筛选器在 finally 块之前运行)。

[ ]

应用程序错误不包含敏感信息或可能被用来利用错误的信息。

Web 部件

代码接受清单的这一部分包含的建议项可帮助确保提交的用于在 SharePoint 环境中部署的解决方案是使用开发 Web 部件的最佳方案开发的。

[ ]

自定义 Web 部件(包括资源文件)包含在一个 SharePoint 功能中,并打包为一个 SharePoint 解决方案以进行部署。

[ ]

要部署的 Web 部件的配置使管理员能够灵活地部署到 Web 应用程序级别或更低级别。

[ ]

可使用 SharePoint Web 部件基础结构的一组标准化连接接口让 Web 部件在运行时相互交换信息。

[ ]

只要有可能,都会为第三方 Web 部件解决方案的源代码提供足够的文档资料,以确保良好的技术支持。

[ ]

所有自定义 Web 部件都利用 SharePoint 体系结构来确保整个应用程序中功能(如单一登录、功能部署等)行为的一致性。

文档

您需要足够的文档来确保要求您部署的自定义项可以安装、受支持且经过测试。此外,文档还指示由自定义项生成的所有错误都得到正确地描述和诊断。代码接受清单的这一部分包含建议的项可帮助确保提交的用于在 SharePoint 环境中部署的解决方案是使用文档最佳方案开发的。

[ ]

自定义项附带有安装说明,其中详细描述了如何安装和卸载程序包,还包含与安装该解决方案相关的体系结构图。如果无法回滚解决方案,则必须在安装说明中进行解释,以便您可以讨论此风险并制定系统恢复计划。

[ ]

自定义项附带有测试文档和结果。

[ ]

自定义项附带有所有依赖项的列表。其中可能包括帐户/密码、Web 服务、数据库、其他解决方案或功能、修补程序、工具集或库,以及其他依赖项。

[ ]

将提供由自定义项生成的所有事件条目以及要采取的操作的列表。此列表可以采用错误代码表格的形式,其中包含每个代码的严重程度和根源。

[ ]

还可以提供源代码以加速 IT 组织的验证和测试。

[ ]

通过升级以前部署的自定义项所得到的自定义项会附带有文档,其中描述所发生的更改、在升级自定义项时的注意事项以及回滚说明。

一般的软件开发最佳方案

代码接受清单的这一部分包含的建议项可帮助确保提交的用于在 SharePoint 环境中部署的解决方案是使用软件开发最佳方案开发的。

[ ]

程序集具有强名称。(动态生成的 ASP.NET 网页程序集当前不能具有强名称。)

[ ]

可使用延迟签名方法来保护和限制在强名称和签名过程中使用的私钥。

[ ]

程序集中包含声明性安全属性(使用 SecurityAction.RequestMinimum)以指定最低的权限要求。

[ ]

高特权程序集将与低特权程序集分隔开。

[ ]

如果程序集要在部分信任的环境中使用(例如,从部分信任的 Web 应用程序中调用),则特权代码将位于单独的程序集中。

[ ]

您需要依赖本机配置文件来支持应用程序,而不是将配置更改为 Web.config。

[ ]

应使用 .NET Framework 2.0、3.0 或 3.5。

[ ]

应使用一个 .NET Framework 版本,不要混用多个版本。

[ ]

您的代码是 64 位兼容代码。

[ ]

您的应用程序不会尝试直接访问任何 SharePoint 数据库。SharePoint 数据库中的数据存储仅使用 SharePoint 对象模型进行更新。

[ ]

避免对字符串和标签进行硬编码,而是使用资源或语言文件。

[ ]

引用 SPWeb 或 SPSite 对象时,应采用 using 语句或显式调用 .Dispose 方法来确保正确使用和释放内存对象。

[ ]

根据需要使用缓存来减少不必要的往返行程。对于 Web 部件,应将缓存过期(持续时间)公开为 Web 部件属性。

[ ]

当打包解决方案时,应包含该解决方案的代码访问安全策略,如有必要,可通过解决方案将程序集包含在安全控件列表中。

[ ]

记录代码时,应使用门户日志类来记录 SharePoint 统一日志记录服务 (ULS) 日志。

[ ]

如果需要使用远程代码更新多个列表项,请使用 Web 服务来更新列表项。仅当必须使用基于 OM 的本地代码一次更新多项时,才应使用 SPListItem.Update()。

[ ]

使用 SPListItemCollection 的 Count 属性时,只需调用它一次,然后将其存储在循环时可以引用的变量中。不能在循环内部调用此属性。

[ ]

解决方案使用 AppSettings 对象来实现 XML 映射。(这可以通过 .NET 2.0、3.0 或 3.5 中的设置持久性框架来提供。)解决方案无需为 XML 映射创建自定义 XML 文件和强类型对象。

[ ]

在事件日志中提供安装和部署日志记录,以实现安装和卸载过程中相应的操作疑难解答。

下载此书籍

本主题包含在以下可下载书籍内,以方便您阅读和打印:

有关可下载书籍的完整列表,请参阅 Office SharePoint Server 2007 的可下载内容