代码审查

liangbq 贡献于2013-06-10

作者 微软用户  创建于2011-09-17 08:21:00   修改者dbc  修改于2011-09-17 13:23:00字数29688

文档摘要:本模块内容安全代码审查的目的是要识别出会导致安全问题和事故的不安全编码技术和漏洞。虽然可能很耗时,但代码审查必须是项目开发周期中的常规事件,这是因为在开发时修复安全缺陷会比以后在产品部署或维护修复周期中再做这项工作节省大量的成本和工作量。本模块帮助您审查使用Microsoft.NETFramework建立的托管ASP.NETWeb应用程序代码。本模块按功能区进行组织,并通过对所需审查的问题列出完整的列表,为您的代码审查过程提供方法指导和框架.
关键词:

 本模块内容 安全代码审查的目的是要识别出会导致安全问题和事故的不安全编码技术和漏洞。虽然可能很耗时,但代码审查必须是项目开发周期中的常规事件,这是因为在开发时修复安全缺陷会比以后在产品部署或维护修复周期中再做这项工作节省大量的成本和工作量。 本模块帮助您审查使用 Microsoft .NET Framework 建立的托管 ASP.NET Web 应用程序代码。本模块按功能区进行组织,并通过对所需审查的问题列出完整的列表,为您的代码审查过程提供方法指导和框架。 返回页首 目标 使用本模块可以: • 创建执行代码审查和 ASP.NET 安全审核的方法和框架。 • 发现代码中的跨站点脚本漏洞。 • 发现代码中的 SQL 注入漏洞。 • 发现代码中的潜在缓冲区溢出。 • 通过请求安全问题的完整列表,快速找到安全问题。 • 评估特定于单独 .NET Framework 技术的安全问题。 • 识别允许恶意用户启动攻击的不良代码技术。 • 了解如何使用 FxCop、文本搜索和 ILDASM 分析源代码和可用 .NET 程序集。 返回页首 适用范围 本模块适用于下列产品和技术: • Microsoft Windows Server 2000 和 2003 • Microsoft .NET Framework 1.1 和 ASP.NET 1.1 • Microsoft SQL Server 2000 返回页首 如何使用本模块 使用本模块可以创建或扩展现有代码审查过程。必须确保代码审查是您的开发周期的不可或缺的一部分,并且要知道代码审查的效果与所投入的资源和预算的数量是成正比的。 由于在开发时修复安全缺陷所需的成本和工作量远比以后在产品部署周期中修复所需的成本和工作量小,所以,审查目标是在部署代码之前尽可能多地识别潜在的安全漏洞。 为了更好地理解本模块,请: • 使用本指南的部分 III 中的其他安全模块。 参考下列这些模块,以便提供有关本模块中分级显示的审查问题的其他信息。 • 模块 6 .NET 安全概述 • 模块 7 构建安全的程序集 • 模块 8 代码访问安全的实践 • 模块 9 ASP.NET 代码访问安全性 • 模块 10 构建安全的 ASP.NET 页面和控件 • 模块 11 构建安全服务型组件 • 模块 12 构建安全的 Web Services • 模块 13 构建安全的远程组件 • 模块 14 构建安全的数据访问 • 使用其他检查表: • 检查表:体系结构和设计审查 • 检查表:保护 ASP.NET 的安全 • 检查表:保护 Web Services的安全 • 检查表:保护企业服务 • 检查表:保护远程处理 • 检查表:保护数据访问 返回页首 FxCop 启动审查过程的好方法是通过 FxCop 分析工具运行已编译的程序集。此工具分析二进制程序集(而非源代码),以确保它们符合 MSDN 中可用的 .NET Framework 设计指南。它还检查您的程序集是否具有强大的名称,以提供防篡改和其他安全收益。此工具随规则的预定义集合提供,虽然您可以自定义和扩展它们。 有关详细信息,请参阅下列资源: • 要下载 FxCop 工具,请参阅 http://www.gotdotnet.com/team/libraries/default.aspx(英文)。 • 要获取此工具的帮助和支持,请参阅 http://www.gotdotnet.com/community/messageboard/MessageBoard.aspx?ID=234(英文)。 • 有关 FxCop 检查的安全规则的列表,请参阅 http://www.gotdotnet.com/team/libraries/FxCopRules/SecurityRules.aspx(英文)。 • 有关 .NET 框架设计指南,请参阅 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpgenref/html/cpconnetframeworkdesignguidelines.asp(英文)。 返回页首 执行文本搜索 要帮助执行审查过程,请检查您是否熟悉可用来找到文件中的字符串的文本搜索工具。此种工具使您可以快速找到易受攻击的代码。本模块后面提供的许多审查问题都指出当查找特定漏洞时要搜索的最佳字符串。 您可能已有喜欢的搜索工具。如果没有,可以使用 Visual Studio .NET 中的“在文件中查找”工具或随 Microsoft Windows 操作系统提供的 Findstr 命令行工具。 注意 如果使用 Windows 资源管理器中的 Windows XP 搜索工具并使用“文件中的一个字或词组”选项,请检查您是否拥有最新 Windows XP Service Pack,否则搜索可能失败。有关详细信息,请参阅 Microsoft 知识库文章 309173 Using the "A Word or Phrase in the File" Search Criterion May Not Work(英文)。 搜索硬编码字符串 执行源代码的详细逐行分析之前,首先快速搜索整个代码库,以便识别硬编码密码、帐户名和数据库连接字符串。扫描代码,搜索诸如下列的常用字符串模式:“key”、“secret”、“password”、“pwd”和“connectionstring”。 例如,要在应用程序的 Web 目录中搜索字符串“password”,请按如下从命令提示使用 Findstr 工具: findstr /S /M /I /d:c:\projects\yourweb "password" *.* Findstr 使用下列命令行参数: • /S - 包括子目录。 • /M - 只列出文件名。 • /I - 使用区分大小写的搜索。 • /D:dir - 搜索一个以分号分隔的目录列表。如果想要搜索的文件路径包含空格,请将此路径包括在英文双引号中。 自动执行 Findstr 可以创建带有常用搜索字符串的文本文件。然后,Findstr 可以从此文本文件读取搜索字符串,如下所示。从包含 .aspx 文件的目录运行以下命令。 findstr /N /G:SearchStrings.txt *.aspx /N 在找到匹配项时打印相应的行号。/G 指出包含搜索字符串的文件。在此例中,将在所有 ASP.NET 页 (*.aspx) 中搜索 SearchStrings.txt 中所包含的字符串。 ILDASM 还可以将 Findstr 命令与 ildasm.exe 工具一起使用,以便搜索硬编码字符串的二进制程序集。下面的命令使用 ildasm.exe 来搜索用来找出字符串常量的 ldstr 中间语言语句。注意下面显示的输出如何显示硬编码数据库连接和众所周知的 sa 帐户的密码。 Ildasm.exe secureapp.dll /text | findstr ldstr IL_000c:ldstr "RegisterUser" IL_0027:ldstr "@userName" IL_0046:ldstr "@passwordHash" IL_0065:ldstr "@salt" IL_008b:ldstr "Exception adding account. " IL_000e:ldstr "LookupUser" IL_0027:ldstr "@userName" IL_007d:ldstr "SHA1" IL_0097:ldstr "Exeception verifying password. " IL_0009:ldstr "SHA1" IL_003e:ldstr "Logon successful:User is authenticated" IL_0050:ldstr "Invalid username or password" IL_0001:ldstr "Server=AppServer;database=users; username='sa' password=password" 注意 Ildasm.exe 位于 \Program Files\Microsoft Visual Studio .NET 2003\SDK\v1.1\bin 文件夹中。有关受支持的命令行参数的详细信息,请运行 ildasm.exe /?。 返回页首 跨站点脚本 (XSS) 无论何时代码在返回到客户端的输出 HTML 流中使用输入参数时,它易受到跨站点脚本(XSS,也称为 CSS)攻击。即使在进行代码审查之前,也可以运行简单测试,以检查应用程序是否易受 XSS 攻击。搜索用户输入信息发送回浏览器的页面。 XSS 缺陷是对用户输入的数据保留太多信任的示例。例如,您的应用程序可能期望用户输入价格,但是反而攻击者包括了价格和一些 HTML 及 JavaScript。因此,应该始终确保对来自不可信来源的数据进行验证。当检查代码时,始终问这个问题“此数据是否经过验证?”。保留 ASP.NET 应用程序的所有入口点(例如 HTTP 头、查询字符串、表格数据等)的列表,并确保在一些点对所有输入进行了有效性检查。不要测试不正确的输入值,这是因为此方法假设您知道所有潜在危险输入。检查此数据在 ASP.NET 应用程序中是否有效的最常用方法是使用正则表达式。 可以通过在表格字段中键入文本(例如 “XYZ”)并测试输出来执行简单测试。如果浏览器显示“XYZ”,或者当您查看 HTML 的来源时看到“XYZ”,则 Web 应用程序易受 XSS 攻击。如果想要看到更动态的内容,请注入 。由于此技术依赖于使用输入生成输出的方法,所以它不适用于所有情况。 下面的过程帮助您识别常见 XSS 漏洞: • 识别输出输入的代码。 • 识别具有潜在危险性的 HTML 标记和属性。 • 识别处理 URL 的代码。 • 检查输出是否被编码。 • 检查字符编码是否正确。 • 检查 validateRequest 属性。 • 检查 HttpOnly cookie 选项。 • 检查 安全属性。 • 检查 innerText 和 innerHTML 属性的使用。 识别输出输入的代码 从浏览器查看页面输出来源,以查看代码是否在属性中。如果是,则注入下面的代码,然后重新测试以查看输出。 "onmouseover= alert('hello');" 开发人员使用的常用技术是筛选“<”和“>”。如果您检查的代码筛选这些字符,则转而使用下面的代码进行测试: &{alert('hello');} 如果代码不筛选这些字符,则可以使用下面的脚本对代码进行测试: ; 使用此脚本之前,必须关闭标记,如下所示。 "> 搜索“.Write” 在 .aspx 源代码和为您的应用程序开发的任何其他程序集包含的代码中,搜索“.Write”字符串。它定位了 Response.Write 的出现以及任何可以通过响应对象变量(例如下面所示的代码)生成输出的内部例程。 public void WriteOutput(Response respObj) { respObj.Write(Request.Form["someField"]); } 您还应该在 .aspx 源代码中搜索“<%=”字符串,它也可以用来写输出,如下所示: <%=myVariable %> 下表显示了 Response.Write 与输入字段一起使用的一些常见情况。 表 21.1:可能的输入源 输入源 示例 表格字段 Response.Write(name.Text); Response.Write(Request.Form["name"]); QueryString Response.Write(Request.QueryString["name"]); Cookies Response.Write( Request.Cookies["name"].Values["name"]); 会话和应用程序变量 Response.Write(Session["name"]); 输入源 示例 Response.Write(Application["name"]); 数据库和数据存储区 SqlDataReader reader = cmd.ExecuteReader(); Response.Write(reader.GetString(1)); 识别具有潜在危险性的 HTML 标记和属性 下列常用 HTML 标记(并不全面)会允许恶意用户注入脚本代码: • • • • •