频道栏目
首页 > 安全 > 网站安全 > 正文

构建和配置更安全的网站

2004-10-02 10:00:13           
收藏   我要投稿

适用于Windows 2000 Advanced Server、Internet 信息服务 5.0、SQL Server 2000 和 .NET Framework 的最佳安全方案

作者:Timothy Bollefer、Girish Chander、Jesper Johansson、Mike Kass、Erik Olson - Microsoft Corp.

Scott Stanfield、James Walters - Vertigo Software Inc.

摘要:由 Microsoft 工程师使用 Microsoft .NET Framework、Microsoft Windows 2000 Advanced Server、Internet 信息服务 5.0 和 Microsoft SQL Server 2000 构建的 Web 站点,在 eWeek OpenHack 4 竞赛中成功顶住了 82500 多次攻击,并一举胜出。本文介绍此解决方案的构建和配置方法,并为软件开发人员和系统管理员确保自己的解决方案的安全性提供了最佳方案。(本文包含一些指向英文站点的链接。)

目录
* 简介
* Web 应用程序
* Internet 信息服务 (IIS) 5.0
* Windows 2000 Advanced Server 操作系统
* IP 安全标准 (IPSec) 策略
* 远程管理与监视
* SQL Server 2000
* 密码
* 小结

简介
2002 年 10 月,eWeek Labs 举行了第四届年度 OpenHack 联机安全性竞赛。此次年度竞赛(这是 Microsoft® 第三次参加此项赛事)旨在通过将系统暴露在 Web 真实而险恶的环境中来测试企业的安全性。eWeek 向 Microsoft 和 Oracle 提供了 Web 应用程序示例,要求双方使用各自的技术重新开发此应用程序。随后,eWeek 又邀请美国各地的计算机用户破坏最终站点的安全性,成功者可领取一定数额的奖金。可接受的破坏包括跨站点的脚本攻击、动态 Web 页面源代码泄漏、破坏 Web 页面、向数据库发送恶意 SQL 命令以及窃取所用数据库中的信用卡数据。

Microsoft 使用 Microsoft® .NET Framework 开发其应用程序。Microsoft® .NET Framework 是一个完整的 Windows 组件,支持构建和运行下一代应用程序和 XML Web Service。此应用程序以 Microsoft® Internet 信息服务 (IIS) 5.0 为宿主,并使用 Microsoft® SQL Server™ 2000 作为其数据库。所有服务器都运行在 Microsoft® Windows® 2000 Advanced Server 操作系统上。(值得注意的是,如果竞赛时已发布带有 IIS 6.0 的 Microsoft® Windows Server 2003,则当时会使用此版本的操作系统。如果使用 Windows Server 2003,则可以省去竞赛中用于“锁定”操作系统和 Web 服务器的几个步骤。)

竞赛结果可以在http://www.eweek.com/category2/1396060043100.asp 中找到。总而言之,Microsoft 的解决方案顶住了 82500 多次攻击。正如它在第一届和第二届 OpenHack 竞赛中表现的一样,Microsoft 安然无恙地从 OpenHack 4 竞赛中胜出。本文将对竞赛中使用的各种技术加以介绍,以说明此解决方案的构建和配置方法,并向确保自己的解决方案安全性的开发人员和系统管理员介绍如何应用这些最佳方案。

Web 应用程序

此应用程序本身模拟 eWeek eXcellence Awards Web 站点。在此站点中,用户可以登记其公司的产品或服务以参与获奖评选。用户可以设置一个帐户,以输入产品或服务进行评选,可以提交信用卡号支付报名费,还可以获取有关奖项本身的信息。Microsoft 使用 .NET Framewo

rk 构建其解决方案,.NET Framework 是一个完整的 Windows 组件,用于构建和运行应用程序及 XML Web Service。大多数开发均围绕 Framework 的 ASP.NET、ADO.NET 和加密类库进行,这三项技术提供的功能分别用于构建基于 Web 的应用程序,访问和使用数据,以及加密、解密和确保数据完整性。

窗体身份验证
Microsoft® ASP.NET 类提供了几个用于验证用户身份的选项(即,使用一些凭据,如用户名和密码,来确认给定用户的身份)。这些选项包括集成的 Windows 身份验证、基本身份验证、摘要身份验证、Microsoft® .NET Passport 以及客户证书等。对于每个 eWeek 请求,OpenHack 解决方案选择了基于窗体的或自定义的身份验证。

当用户通过窗体身份验证登录时,系统将创建一个加密的 cookie,用于在整个站点中跟踪用户。(从技术角度而言,cookie 是一个由 Web 站点生成的纯文本字符串,可进入用户的 Web 浏览器内存,用于对浏览站点的用户进行标识。)

如果用户在未登录的情况下请求一个安全页面,系统会将此用户重定向到登录页面,所有这些都只需要使用应用程序的基于 XML 的 Web.config 文件进行配置就可以实现。该文件由 Microsoft® Visual Studio® .NET(用于构建基于 .NET Framework 的应用程序的集成开发环境)自动生成,用于存储 ASP.NET Web 应用程序的配置。

在应用程序的根文件夹中,我们向 Web.config 文件的 <system.web> 部分添加了以下几行代码,以请求基于窗体的身份验证并指定登录页的位置。

<authentication mode="Forms">
<forms loginUrl="Login.aspx" name="OPSAMPLEAPP"/>
</authentication>

此顶层配置文件应用到此应用程序的所有页面。然后,用第二个 Web.config 文件创建子目录。此文件只应用到应用程序中的少数几个选定页面,以防未经身份验证的用户(即匿名用户)对其进行访问。第二个 .config 文件继承了顶层 .config 文件的身份验证信息。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.web>

<authorization>
<deny users="?" />
</authorization>

</system.web>
</configuration>

通过这种方式使用这两个 .config 文件,未经身份验证的用户只能访问主页和其他少数几个页面,而已通过身份验证的用户则还可以访问站点上那些需要用户登录的页面。

登录页本身包含供用户输入用户名和密码的字段,并通过安全套接字层 (SSL) 将其返回给 Web 服务器,从而防止某些用户“窃取”网络中传递的凭据。用户创建新帐户后,Web 应用程序将使用 Triple DES 算法将新密码加密(详见存储机密信息一节的介绍),并将其与用户名一同存储在数据库中。以后登录时,Web 应用程序将使用 Triple DES 对在登录页输入的密码进行加密,然后与数据库中存储的加密密码进行比较。如果这两个密码匹配,Web 应用程序将使用 ASP.NET 库中的 System.Web.Security.FormsAuthentication 类生成一个包含用户的用户名和姓名的加密 cookie。此 cookie 将返回给用户并储存在用户的浏览器中,直到超时为止。用户此后向 Web 站点发送的任何请求都会包含此 cookie。所有涉及 cookie 的传输都使用 SSL 进行,以防“重放”攻击(即攻击者从网络中窃取到 cookie,然后使用它假冒用户进行操作)。强烈建议您通过公共网络发送可用于访问敏感信息的敏感信息或凭据时使用 SSL。

输入有效性验证
OpenHack 在应用程序中实现了不同级别、不同类型的有效性验证,以确保代码以外的输入(即用户输入)无法更改应用程序的操作。验证输入有效性是一个关键的最佳安全方案,有助于防止

缓存溢出、跨站点的脚本攻击以及其他潜在的在应用程序上下文中执行恶意代码的尝试。提供多层保护(正如此处所做的)是另一个重要的最佳安全方案,称为“层层设防”。做最坏的打算并假定解决方案的一层或多层可能遭到破坏,这往往很重要。

第一道防线是由 ASP.NET(特别是 RegularExpressionValidator 类和 RequiredFieldValidator 类)提供的有效性验证控制,可确保提供了所需的所有输入,且均为有效数据。只允许使用用于提供所需用户操作的字符,在本例中,字符范围很有限。例如,某些字段只允许输入“[ .0-9a-zA-Z_]*”,即空格、单引号、逗号、句号、字母和数字。其他可用于向 Web 站点发送恶意脚本的字符被禁止使用。

除文本框以外,本应用程序还通过“查询字符串”接受某些输入,查询字符串是动态 URL 的一部分,包含用于生成页面的参数。通过 System.Text.RegularExpressions.Regex 类提供的功能,用正则表达式对数据进行验证,如下所示:

Regex isNumber = new Regex("^[0-9]+$");
if(isNumber.Match(inputData) ) {
// 使用它
}
else {
// 丢弃它
}

正则表达式是用于匹配文本模式的字符和语法元素集合。在 OpenHack 应用程序中,它们用于确保查询字符串内容是正确且无恶意的。

此应用程序中的所有数据访问均通过参数化存储过程完成,这些存储过程是使用 T-SQL 语言开发的,并且根据定义在数据库内运行。将与数据库的交互限制到存储过程,这通常是一个最佳方案。如果不存在存储过程,则 SQL 查询必须由 Web 应用程序动态构造。如果 Web 层遭到破坏,攻击者就可以向数据库查询中插入恶意命令,以检索、更改或删除数据库中存储的数据。使用存储过程,Web 应用程序与数据库的交互操作仅限于通过存储过程发送的几个特定的严格类型参数。每当开发人员使用 .NET Framework 调用存储过程时,系统都会对发送到此存储过程的参数进行检查,以确保它们是存储过程可接受的类型(如整数、8 个字符的字符串等)。这是 Web 层有效性验证上的又一个保护层,可确保所有输入数据格式正确,而且不能自行构造为可操作的 SQL 语句。

任何数据在返回给用户前均采用 HTML 编码。这只需使用 System.Web.HttpServerUtility 类中的 HtmlEncode 方法即可实现,如下所示。

SomeLabel.Text = Server.HtmlEncode(username);

HTML 编码有助于防止跨站点的脚本攻击。攻击者一旦破坏了数据库,便可向记录中输入脚本,此脚本随后返回给用户并在浏

相关TAG标签 网站
上一篇:网站浏览安全细细谈
下一篇:SQLSERVER注入必殺技
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站