增强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” 。
【增强Web的安全性】如用户存在,将返回一条包括用户名和密码的记录,然后判断由数据库返回的密码和用户输入的密码值:
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 语句 。

推荐阅读