1. 对密码加密
别人盗走数据库文件还不是最可怕的,最可怕的是他利用里面的用户名和密码非法登录系统,从而进行更大的破坏。因此,可以利用System.Web.Security.FormsAuthentication类的共享方法HashPasswordForStoringInConfigFile,就可以对数据库使用MD5算法或SHA1算法对密码进行加密,这样就算别人盗走数据库,也不知道密码。具体步骤如下:
当用户注册时,可以将用户输入的密码加密后在保存到数据库中;当用户在次登录输入原始密码后,再将密码加密后和数据库中的密码进行判断。
2. 防止SQL注入式攻击
SQL注入式攻击是指一些人故意在表单中输入SQL命令,使得程序判断错误,然后达到非法进入系统或破坏系统的目的。
要防范SQL注入式攻击,其实就是要禁止客户输入危险字符,或者不让客户输入的危险字符发挥作用。一般有以下几种方法:
⑴ 利用服务器验证控件要求用户必须输入合法的字符。不允许用户输入单引号、OR等危险字符。 ⑵ 不要使用SQL字符串来判断,而是使用含有参数的SQL语句或者存储过程来判断,这样用户输入表单值是当作一个参数传进去的,此时输入的单引号就无法和SQL字符串中的单引号配对,也就无法发挥作用。
⑶ 比较简单的方法还有用Replace函数将用户输入的危险字符替换为对应的字符实体或者直接将其从字符串中删除。
3. 添加完整的用户注册、登录和管理模块
应该添加完整的用户管理系统,用户必须注册才能登录系统,并且不同类型的用户只能操作被授权的页面。一般来说,普通用户只能简单到浏览系统,而管理员用户则可以完成更多的操作。
4. 使用复杂的记录编号
一般的页面,不管是打开详细的页面,还是打开修改和删除页面,都是将记录编号ID传过去,在另一个页面中根据这个编号处理相应的记录。
这种记录编号一般都是自动编号类型,从1开始,依次类推。当打开某条记录的修改页面时,浏览器地址栏中显示的是如下的URL。
例如:http://localhost/aspx.netcase/chapter5/6/address2/UpdataData.aspx?id=2
可以看到,最后面的2就是传过来的记录编号。如果用户手工修改为3,4,然后按回车键,可能就会打开其他记录的修改页面。
这种现象存在一定的危险性,比如某些用户登录系统后,如果他在浏览器地址栏中手工修改了这个编号,就可能会打开不属于他的页面。
一个简单的解决方法是修改自动编号字段的字段大小。因为此时的自动编号字段id不再是数字,而变为了字符串,所以在详细、修改和删除页面中要修改用到的id的SQL语句。
- 18 -
5 详细设计与系统实现
详细设计是整个设计过程中,最重要的步骤之一。下面分几个模块对系统进行详细设计。
5.1系统登录模块
5.1.1 模块介绍
该模块主要由两个页面组成:系统登录页面(Login.aspx)和系统主页面(Home.aspx)。其功能主要是对用户登录时进行身份鉴别,然后将用户导向系统主页,显示当前用户名称,用户在系统中所处的位置,并向用户展示系统的主要功能,提示用户可以进行的操作,同时随时给予用户系统的反馈信息。 在该模块中,通过创建ASP.Net应用程序,可以在global.asa文件里指定系统允许用户尝试登录次数(本系统里设置的次数为4次),如果超过这个次数,系统不再显示登录页面,用户只能从系统里退出后重新进入登录页面,此时用户以前输入的身份信息都会被清空。
本系统中的各个模块里都用到了Session(会话)对象和Application(应用程序)对象。为了实现对用户登录尝试次数的控制,在global.asa文件中用Application_Onstart事件 附:global.asa文件源代码
上面源代码里,声明了Application对象的NumAttempts的值,其含义是指允许用户尝试登录的次数。 5.1.2 模块中的主要页面示例
1. 系统登录页面(Login.aspx)介绍
系统登录页面(Login.aspx)主要用于对用户身份进行鉴别。用户通过填写表单提供登录信息,系统根据用户所填写的信息对用户进行查询鉴别,如果用户的身份合法,则将用户导向系统主页面(Home.aspx)。
另外该页面指定系统允许用户尝试登录次数(本系统里设置的次数为4次),如果超过这个次数,系统不再显示登录页面,用户只能从系统里退出后重新进入登录页面,此时用户以前输入的信息都会清空。
⑴ 页面截图如图5-1和图5-2所示。
- 19 -
图5-1 系统登录页面图1
图5-2 系统登录页面图2
⑵ 页面中所用到的数据库组件。
该页面使用了一个系统用户信息表(PSLogins)。在系统登录页面里要引用该表的ID字段、LoginID字段和Password字段进行用户身份鉴别,如果用户身份通过验证,页面还要纪录用户的详细信息,留待以后系统中的其他页面使用。
⑶ 页面中所用到的表单元素如表5-1所示。
表5-1 系统登录页面中的表单元素
名 称 Username Password Login Reset 表单元素类型 Text Password Submit Reset Value 值 用户填写 用户填写 登录 重设 - 20 -
含 义 用户登陆名 用户登陆密码 提交表单 重设表单 ⑷ 页面中所用到的ASP.NET代码: 首先是向系统编译器说明脚本语言 <%@ Page Language=\
对于系统而言,首先应该判断用户是否首次进入页面,是则向用户显示登录窗口,并记录提交信息的次数,用字符串变量The Message来记录显示系统对用户各项操作的反馈和信息。
<%
' 判断用户是否提交表单
if isempty(Request.Form(\ Session.abandon
Session(\
TheMessage = \请在下面登录:(缺省管理员用户名:40231054,密码:31415926)\'校验用户提交的用户信息
如果用户已经提交信息,则对用户所提交的信息进行字符串格式判断,信息中不能含有“,”(单引号字符),然后建立和数据库的连接。
else
If Instr(TheUsername, \ and Instr(ThePassword, \' 建立数据库的连接
sqlConnection myConnection = new sqlConnction ( ) ;
myConnection.ConnectionString = “user id = sa ; password = yourpassword ;” + “initial catalog = Datasource ; data soure = my SQLServer ; Connect Timeout = 3.” ; myConnction.Open ( ) ;
TheUsername=Request.Form(\ThePassword=Request.Form(\系统登录页面有3种可能的状态: (1)用户第一次进入页面。
(2)用户已经提交登录信息,系统页面做出反馈。
(3)用户已经多次提交登录信息,并超过了系统设置的用户登陆最大尝试次数,则根据系统设置可以停止用户登录。
然后根据用户提供的信息,在数据库表里进行匹配查询
set RSLogin = conn.Execute(\ & TheUsername & \如果无法匹配,则纪录用户登录的次数
- 21 -
if RSLogin.EOF then
Session(\
如果在global.asa里设置了Application对象的NumAttempts的值为0,则意味着系统的对登录次数不作限制,生成反馈信息如下:\登录不成功,请重试:\
if Application(\TheMessage = \登录不成功,请重试:\
如果Application对象的NumAttempts的值不为0,则对目前登录次数和Application对象的NumAttempts的值中指定的登录系数作比较,并提示当前用户。
elseif Session(\TheMessage = \登录不成功,登录次数已满,无法重试\else
TheTimes=Application(\TheMessage = \登录不成功,还有\次机会,请重试:\end if
如果登录成功,则记录下当前用户的详细信息,并导向系统主页面。 else
Session(\
Application(\ Session(\Session(\Session(\Session(\Session(\Session(\Session(\Session(\
Session(\
Session(\Session(\Response.Redirect \
end if else
TheMessage=\用户名或者密码输入不合格式\
- 22 -