[转]增强Web的安全性
通过互联网,人们可以做网上交易等各种事情。如何使信息不被窃取、站点不被破坏,就成了网络应用开发者、网管员的重要责任。本文介绍了几种提高Web站点安全的原则和方法。
一、应用环境
一般来说,提供数据库应用服务的Web站点主要由操作系统服务器、数据库服务器和Web服务器三项构成,由此,我们对Web站点的安全设置就可以从这三方面入手。基于不同的环境配置的Web解决方案,其安全考虑各有侧重,但基本的原则是大致相同的。下面我们以基于Windows2000 Advanced Server、Internet信息服务5.0和SQL Server 2000环境构建Web解决方案为例,讨论Web站点的安全问题。此外,由于目前大多数网站开发都使用Microsoft的.Net Framework,我们将.Net Framework也考虑进去。
二、解决方法
1.Web应用程序层安全
Web应用程序层安全即是在进行Web应用开发时应该考虑的安全因素,这里包括窗体身份验证、输入有效性验证、使用参数化存储过程、输出数据HTML编码、信息加密等内容。
(1) 窗体身份验证
窗体身份验证即是当用户请求一个安全页面时,系统要对其进行判断,如果该用户已经登录系统并尚未超时,系统将返回此页面给请求用户; 反之如该用户尚未登录,系统就要将此用户重定向到登录页面。
以上所述功能的实现只需对Web.config文件进行如下配置即可。
如果系统中某些页面不希望被匿名身份用户访问,可以对Web.config进行如下配置:
……
……
对进行身份验证的登录页本身,应该采取两步方式验证用户存在且密码正确,且不可为图简便而使用一条SQL语句进行验证(如果攻击者攻破网站,并将SQL语句的where子句末尾加上一段永远为真的判断语句,则无论何时他都可以通过身份验证)。
存在安全隐患的身份验证语句是:select * from users where name = namestr and password = passwdstr。
比较安全的用户身份验证应该是:判断用户是否存在用“select name,password from users where name = namestr”。
如用户存在,将返回一条包括用户名和密码的记录,然后判断由数据库返回的密码和用户输入的密码值:
if password = passwdstr {
//通过验证后的程序代码
……
}else{
//未通过验证后的程序代码
……
}
为加强用户名、密码等这些敏感信息在公网上的安全传输,应通过安全套接字层加密后再返回给Web服务器。
(2) 输入有效性验证
输入有效性验证即是对所有用户输入的字符范围进行限制,以防可用于向Web站点发送恶意脚本的字符被禁止使用。
通过ASP.NET的System.Text.RegularExpressions.Regex 类提供的功能,用正则表达式对数据进行验证,如下所示:
Regex isNumber = new Regex(“^[0-9]+$”);
if(isNumber.Match(inputData) ) {
// 使用它
……
}
else {
// 丢弃它
……
}
正则表达式是用于匹配文本模式的字符和语法元素集合,用于确保查询字符串是正确且无恶意的。
(3) 使用参数化存储过程
使用参数化存储过程是指在Web应用中,尽可能将对数据库的操作使用存储过程来完成,而不是动态构造SQL语句。
将与数据库的交互限制到存储过程,这通常是增强Web安全的一个最佳方案。如果不存在存储过程,则 SQL 查询必须由 Web 应用程序动态构造。如果 Web 层遭到破坏,攻击者就可以向数据库查询中插入恶意命令,以检索、更改或删除数据库中存储的数据。使用存储过程,Web 应用程序与数据库的交互操作仅限于通过存储过程发送的几个特定的严格类型参数。每当开发人员使用.Net Framework 调用存储过程时,系统都会对发送到此存储过程的参数进行检查,以确保它们是存储过程可接受的类型(如整数、8 个字符的字符串等)。这是 Web 层有效性验证上的又一个保护层,可确保所有输入数据格式正确,且不能自行构造为可操作的 SQL 语句。
(4) 输出数据HTML编码
输出数据HTML编码是指在将任何数据返回给用户前均应采用HTML编码,以防止跨站点的脚本攻击。因为攻击者一旦破坏了数据库,便可向记录中输入脚本,此脚本随后被返回给用户并在浏览器中执行。通过HTML编码,可将大多数脚本命令自动转换为无害文本。
通过System.Web.HttpServerUtility 类中的 HtmlEncode 方法可实现HTML编码,如下所示:
SomeLabel.Text = Server.HtmlEncode(username);
(5) 信息加密存储
信息加密存储是指对如数据库连接字符串、用户秘密等敏感信息进行加密存储,以妥善保护数据。
数据库连接字符串存放有包括数据库服务器的位置、数据库名称和用户名&密码等数据库连接信息,攻击者一旦设法读取字符串就可用它来访问数据库并对数据库进行恶意破坏。通常我们可以采用以下方法保护加密连接字符串等秘密信息:加密连接字符串,将其存储在注册表中,并使用访问控制列表(ACL)确保只有系统管理员和ASP.NET辅助进程才能访问注册表项。通过使用.Net Framework 的 System.Security.Cryptography 类中的 TripleDES 类提供的功能可实现对信息的加密。
2.Internet信息服务(IIS)层安全
对IIS进行安全配置一般包括如下几方面内容,可最大程度地保障系统安全:
(1) 尽可能安装软件的最新版本;
(2) 尽可能安装软件的最新服务包和修补程序;
(3) 将磁盘上的默认Web站点位置从c:\inetpub\更改到其他卷,以防止攻击者通过输入“..\”作为位置说明轻松访问C:驱动器;
(4) 使用IIS锁定工具(IIS Lockdown Tool)删除应用程序中未使用的所有其他动态内容类型,以减少攻击者可用来攻击的区域;
(5) 确保应用程序使用低权限的默认本地服务账户(ASP.NET账户)运行ASP.NET代码;
(6) 将ASP.NET账户添加到IIS锁定工具创建的本地“Web应用程序组”,以防进程在被偷袭时运行任何未得到授权的命令行可执行程序;
(7) 修改Web应用程序组权限,使其可运行应用程序需要的如.Net Framework C#编译器和资源转换器(Cse.exe和Cvtres.exe)等资源;
(8) 配置URLScan2.5,使其只允许应用程序中使用的扩展集,并阻止较长的请求(URLScan2.5是由IIS锁定工具安装的,是一个ISAPI过滤器,可根据查询长度和字符集等规则监视和过滤发送到IIS Web服务器的所有输入请求);
(9) 设置Web内容目录的访问权限,授予ASP.NET进程对内容文件的读访问权限,授予匿名用户对所提供内容的适当只读访问权限;
(10) 限制对IIS和URLScan的日志目录的访问,只有系统账户和系统管理员组才具有访问权限。
3.Windows2000 Advanced Server操作系统层安全
为增强操作系统的安全性,应尽可能安装当时发布的最新服务包,尽可能关闭应用程序未用到的服务。下面介绍几个注册表值。
(1) 创建注册表项:nolmhash
在 Windows 2000 中,这是一个关键字,而在 Windows XP 和 Windows Server 2003 中,这是一个值。
位置:HKLM\System\Current ControlSet\Control\LSA ;
用途:防止操作系统以 LM 散列格式存储用户密码。此格式只用于不支持 NTLM 或 Kerberos 的 Windows 3.11 客户端。创建和保留此 LM 散列的风险在于,如果攻击者设法将以此格式存储的密码解密,就可以在网络上的其他计算机上重复利用这些密码。
(2) 创建注册表值:NoDefault Exempt
位置:HKLM\System\Current ControlSet\Services\IPSEC ;
用途:默认情况下,IPSec 将允许源端口为 88 的传入通信查询 IPSec 服务,以获取连接到计算机的信息,而不管使用的是哪种 IPSec 策略。通过设置此值,除了我们设置的 IPSec 过滤器允许的通信以外,不允许端口之间进行任何通信。
(3) 创建注册表值:Disable IPSource Routing
位置:HKLM\System\ CurrentControlSet\Services\Tcpip \Parameters;
用途:防止 TCP 数据包显式确定到最终目标的路由,并防止它要求服务器确定最佳路由。这是一个防止“人在中间”攻击(即攻击者通过自己的服务器对数据包进行路由,并在数据包传递期间窃取其中的内容)的保护层。
(4) 创建注册表值:Syn Attack Protect
位置:HKLM\System\Current ControlSet\Services\Tcpip\ Parameters ;
用途:此注册表项通过限制分配给传入请求的资源来防止操作系统受到某种 SYN-Flood 的攻击。换句话说,这将帮助阻止在客户端和服务器之间试图使用 SYN(即同步)请求以拒绝服务的攻击。
4.SQL Server2000数据库服务器层安全
为增强数据库系统的安全性,应尽可能满足以下原则:
(1) 将SQL Server安装在NTFS分区上;
(2) 安装当时发布的最新服务包和修补程序;
(3) 限制所支持的身份验证协议的数量(在控制面板→管理工具→本地安全设置→安全设置→本地策略→安全选项→网络安全: LAN Manager身份验证级别中进行设置);
(4)选择低权限本地账户,启动SQL Server服务;
(5) 使用Services MMC 管理单元停止 Distributed Transaction Coordinator (MSDTC) 服务,并将其设置为手动启动,以防数据库运行失误,并且服务器本身也不会运行 COM+ 应用程序;
(6) 禁用应用程序不需要的 SQL Server 代理和 Microsoft 搜索服务;
(7) 设置Server Network的网络属性,由“直接客户端广播”改为“隐藏 SQL Server”;
(8) 如应用程序不使用“命名管道”协议,则删除之;
(9) 限制数据库用户只具有用得到的数据库操作权限。
三、小结
以上所列出的增强Web解决方案的各种原则和方法,归纳如下:
1. 在原始设计中考虑安全问题,这包括开发工具采用最新的服务包和修补程序;
2. 总是使用复杂且不明显的密码;
3. 关闭所有不必要的功能;
4. 坚持“最低权限”原则,决不授予并非绝对必需的权限;
5. 使用 IIS 时,运行 IIS 锁定工具和 URLScan;
6. 验证所有输入数据;
7. 使用参数化的存储过程,而不是在数据库上生成动态查询。
本文列出的增强Web方案安全性的一般原则和方法,并不一定适用于所有的Web解决方案,只希望能抛砖引玉,引出更多更好的有关增强Web安全性的建议。