Web安全解决方案
-
什么是 .NET Framework 安全性?
.NET Framework 提供了用户和代码安全模型,允许对用户和代码可以执行的操作进行限制。要对基于角色的安全性和代码访问安全性进行编程,可以从 System.Security 命名空间中使用类型。.NET Framework 还提供了System.Security.Cryptography 命名空间,公开对称和不对称的加密与解密、散列、随机数生成、数字签名支持等。
要理解 .NET Framework 安全性基本设置,请参阅“.NET 安全基础”单元。
-
如何编写安全托管代码
用强名称对程序集进行数字签名,使它们不能随意改动。同时,在结合使用强名称的程序集和 ASP.NET 时,需要注意强名称的问题。通过遵守坚固的面向对象设计原理,减小程序集受攻击面,然后使用代码访问安全性,进一步限制哪些代码可以调用您的代码。使用结构化的异常处理方法防止敏感信息蔓延到当前信任边界之外,并开发更加可靠的代码。避免常规问题,特别是输入文件名和 URL 的问题。
有关如何提高托管代码安全性的信息,请参阅“构建安全的程序集”单元。有关如何有效使用代码访问安全性,以进一步提高安全性的详细信息,请参阅“代码访问安全实践”单元。有关执行托管代码复查的信息,请参阅“Security Code Review”单元。
-
如何安全地处理异常
不要显示内部系统或应用程序的详细信息,如堆栈跟踪、SQL 语句片断等。确保这类信息不被允许蔓延到最终用户或当前信任边界以外。
在异常事件中安全地失败,确保应用程序拒绝访问,而且没有停留在不安全的状态下。不记录敏感或私有数据,如密码,以免造成危害。在记录或报告异常时,如果用户的输入包括在异常消息中,对其进行验证或清理。例如,如果返回一个 HTML 错误消息,您应该对输出进行编码,以避免脚本注入。
有关更多信息,请参阅“构建安全的程序集”和“构建安全的 ASP.NET 页和控件”两单元的“Exception Management”部分。
-
如何执行托管代码的安全复查
使用分析工具(如 FxCop)分析二进制程序集,确保它们符合 .NETFramework 设计准则。修复分析工具识别出的所有安全缺陷。使用文本搜索工具扫描硬编码机密(如密码)的源代码库。之后,复查具体的应用程序元素,包括 Web 页面和控件、数据访问代码、Web 服务、服务组件等。要特别注意 SQL 注入和跨站点脚本编写缺陷。
还要对使用敏感的代码访问安全技术进行复查,如链接声明和断言。有关更多信息,请参阅“Code Review”单元。
-
如何保证开发人员工作站的安全性
您可以使用一套方法保证工作站的安全性。保证您的帐户、协议、端口、服务、共享、文件与目录和注册表的安全。最重要的是,保持您的工作站具有当前最新的补丁与更新。如果您在 Microsoft Windows_ XP 或 Windows 2000 上运行 Internet 信息服务 (IIS),则运行 IISLockdown。IISLockdown 应用安全的 IIS 配置,并安装 URLScan Internet 安全应用程序编程接口 (ISAPI) 筛选器,该筛选器用于检测和拒绝潜在的恶意 HTTP 请求。例如,您可能需要修改默认 URLScan 的配置,这样您就可以在开发和测试期间调试 Web 应用程序。
有关更多信息,请参阅本指南的“如何做”部分的“如何保证开发人员工作站的安全”。
-
如何结合使用代码访问安全性和 ASP.NET
使用 .NET Framework 版本 1.1,您可以在 Machine.config 或 Web.config 中设置 ASP.NET 的信任级。这些信任级使用代码访问安全性,以限制 ASP.NET 应用程序可以访问的资源,例如文件系统、注册表、网络、数据库等。此外,它们还提供了应用程序隔离。
有关从 ASP.NET 使用代码访问安全性、开发部分信任的 Web 应用程序和沙箱化特权代码的详细信息,请参阅“在 ASP.NET 中使用代码访问安全”单元。
有关代码访问安全性的基础的详细信息,请参阅“代码访问安全实践”单元。
有关在开发托管代码时需要考虑的代码访问安全性问题的详细信息,请参阅“构建安全的服务组件”、“构建安全的 Web 服务”、“构建安全的远程组件”和“构建安全的数据访问”等单元的“代码访问安全注意事项”部分。
-
如何编写具有最低权限的代码
可以限制代码能够执行的操作,这与运行该代码所使用的帐户无关。通过配置策略或如何编写代码,您可以使用代码访问安全性来限制代码允许被访问的资源和操作。如果代码不需要访问某种资源或执行某种敏感操作(如调用非托管代码),可以使用声明性安全属性来确保代码不会被管理员授予这种权限。
有关更多信息,请参阅 “代码访问安全实践”单元。
-
如何限制文件 I/O
可以使用代码访问安全性来限制程序集访问文件系统区域和执行 I/O 的能力。例如,可以限制某个 Web 应用程序,使它只能在它的虚拟目录层次结构下执行文件 I/O。您也可以将文件 I/O 限制在特定的目录上。这可以通过编程或配置代码访问安全策略来完成。
有关更多信息,请参阅“代码访问安全实践”单元的“文件 I/O”和“在 ASP.NET 中使用代码访问安全”单元的“媒体信任”。有关配置代码访问安全策略的详细信息,请参阅“如何使用 CAS 策略约束程序集”。
-
如何防止 SQL 注入
使用数据访问的参数化存储过程。使用参数要确保输入值的类型和长度都得到检查。参数也被视作安全文本值和数据库内的不可执行代码。如果不能使用存储过程,就使用带有参数的 SQL 语句。不要通过连接 SQL 命令和输入值来构建 SQL 语句。还要确保应用程序使用具有最低权限的数据库登录,以限制它在数据库中的功能。
有关 SQL 注入的详细信息和进一步对策,请参阅“构建安全的数据访问”单元的“SQL 注入”。
-
如何防止跨站点脚本编写
对输入类型、长度、格式和范围进行验证,并对输出进行编码。如果输出包括输入(包括 Web 输入),则对输出进行编码。例如,对窗体字段、查询字符串参数、cookie 等进行编码,以及对从无法假定其数据是安全的数据库(特别是共享数据库)中读取的输入进行编码。对需要以 HTML 返回客户端的自由格式输入字段,对输出进行编码,然后选择性地清除在许可元素(如用于格式化的 <b> 或 标记)上的编码。
有关更多信息,请参阅“构建 ASP.NET 页和控件”单元的“跨站点脚本编写”。
-
如何管理机密
最好寻找避免存储机密的替代方法。如果必须存储它们,则不要在源代码或配置文件中以明文的方式存储。使用数据保护应用程序编程接口 (DPAPI) 加密机密,以避免关键的管理问题。
有关更多信息,请参阅“构建安全的 ASP.NET 页和控件”单元的“敏感数据”、“构建安全的程序集”单元的“加密”和“保证 ASP.NET 应用程序的安全”单元的“Aspnet_setreg.exe 与进程、会话和标识”。
-
如何安全地调用非托管代码
特别注意传递给非托管 API 和非托管 API 传递出的参数,防止潜在的缓冲区溢出。验证输入和输出字符串参数的长度,检查数组边界,并特别小心文件路径的长度。在断言非托管代码权限之前,使用自定义权限声明保护对非托管资源的访问。如果用 SuppressUnmanagedCodeSecurityAttribute 提高性能,请小心使用。
-
如何执行安全的输入验证
对输入进行限制、拒绝和清理,因为验证已知有效类型、模式和范围的数据要比通过查找已知错误字符来验证数据容易得多。验证数据的类型、长度、格式和范围。对字符串输入,请使用正则表达式。要使用执行类型检查,则使用 .NET Framework 类型系统。有时候,可能需要对输入进行清理。一个例子是对数据编码,以保证其安全性。
有关输入验证设计策略,请参阅“设计安全 Web 应用程序的指导方针”单元的“输入验证”。有关实现细节,请参阅“构建安全的 ASP.NET 页和控件”、“构建安全的 Web 服务”、“构建安全的远程组件”和“构建安全的数据访问”单元的“输入验证”部分。
-
如何保证窗体身份验证的安全性
划分 Web 站点,隔离匿名用户可以访问的公共可访问页面和需要身份验证访问的限制性页面。使用安全套接字层 (SSL) 来保护窗体身份验证凭据和窗体身份验证 cookie。限制会话生存时间和确保身份验证 cookie 只在 HTTPS 上传输。对身份验证 cookie 加密,不要在客户端计算机上保留它,也不要将其用于个性化目的;对个性化使用单独的 cookie。