发信人: lofe ()感激生活(), 信区: BorlandDev
标  题: 建 立 应 用 软 件 注 册 安 全 机 制 
发信站: 哈工大紫丁香 (Mon Sep  4 16:17:21 2000), 转信

建立应用软件注册安全机制
海南大学叶斗彪
软件的安全性是个永恒的话题,一直困扰着人们,程序员们常常因此
熬夜。Novell公司的网络操作系统NetWare以其完善可靠的安全管理
机制著称,为实现用户登录的安全性和防止非法入侵者闯入,系统
提供了几种有效的限制措施和检测功能。本文讨论如何建立完善的
软件注册安全机制,有效地管理用户登录,为应用软件提供可靠的
保护,并在Delphi 3.0下实现。
  ---- Delphi作为一个优秀的编程工具,功能极其强大,令开发
周期大大缩短,生成的代码运行速度快,使得Windows软件设计成为
一种乐趣。基本思路是:建立Paradox格式的用户帐户表Users.DB,
并加密保护,由管理员维护。预先在此表中登记并有注册权限的用户,
可持本人有效口令登录进入系统。
  ----实现步骤如下:
  ---- 1.在应用软件主目录(假设为C:\Register)下创建两个
子目录,分别命名为Login和Data。
  ---- 2.从Delphi的Tools菜单中启动Database Desktop,并选
择Tools/Alias Manager…创建一个新别名。方法是:在Alias Manager
对话框中点New,给出新别名UserInfo,并指向C:\Register\Data目
录,按Keep New、OK等按钮保存新别名。
  ---- 3.利用Database Desktop创建Paradox 5.0 for Windows
数据表Users.DB,结构见表1。事实上,对于商业软件还需要更多的
域。
  表1 表Users.DB的结构域名 类型 大小 关键字 说明Name A 16 *
用户名Password A 16 * 注册口令Fullname A 32  用户全名Group I
用户组号Enabled L   注册允许
  ---- 4.设定Name, Group和Enabled为非空域(Required Field),Group
的最小值为0,最大值为3,默认值为3,Enabled的默认值为True。用
户组0为系统管理员,可进行几乎任何操作;用户组1为软件操作人员,
可进行除用户帐户管理以外的操作,包括建立和删除数据;用户组2
为普通用户,可使用系统资源,无修改权限,而用户组3仅可浏览系
统有限信息。
  ---- 5.用口令"UserPassword"保护Users.DB表,存于Data目录
下。利用Database Desktop向表中输入若干样本用户(见表2),然
后关闭Database Desktop。
  表2 表Users.DB的样本用户Name Password Fullname Group EnabledSupervisor A
AAAAA Super
 User 0 TrueDirector BBBBBB Director User 1 TrueGuest    3 TrueUser1 CCCCCC 
General
 User1 1 FalseUser1 DDDDDD General User1 2 TrueUser2 EEEEEE General
 User2 3 True
  ----表2显示,允许同一用户以不同身份(用户组)登录进入系
统,享有不同的权限。如用户User1,以不同密码登记,分属用户组1
和2。
  ---- 6.返回Delphi IDE,新建项目Register.dpr并存入C:\Register
目录,主窗体单元命名为Main.pas。用户注册成功后,方能启动主窗
体进入系统。本系统仅显示用户信息及登录的日期和时间以表示注册
成功(见图5),并不做其它任何事情,这里便是读者应用系统的接
口。为此,在主窗体上放入一个TGroupBox组件,TLabel和TEdit组件
各五个。将所有TEdit的Text属性清空,ReadOnly属性值设为True,
窗体和组件其余属性按表3设置。
  ---- 7.创建主窗体的OnActivate事件处理程序,登录成功并激
活主窗体时执行,显示用户信息、登录日期和时间。过程如下:
  procedure TMainForm.FormActivate(Sender: TObject);begin
  if Time< =StrToTime('12:00:00') then
  Caption:='上午好,您已成功登录!'
  else
  Caption:='下午好,您已成功登录!';
  //显示登录用户信息、登录日期和时间
  NameEdit.Text:=LoginUser.UserName;
  FullNameEdit.Text:=LoginUser.UserFullName;
  GroupEdit.Text:=IntToStr(LoginUser.UserGroup);
  DisplayDateEdit.Text:=DateToStr(Date);
  DisplayTimeEdit.Text:=TimeToStr(Time);end;
  表3 主窗体中组件属性设置组件 属性 设置Form1 Caption  Name MainForm Posit
ion poScreenCenterGroupBox1 Caption
用户信息Label1 Caption 用户名称:
  Label2 Caption 用户全名:
  Label3 Caption 用户组号:
  Label4 Caption 登录日期:
  Label5 Caption 登录时间:
  Edit1 Name NameEditEdit2 Name FullnameEditEdit3 Name GroupEditEdit4 Name
 DisplayDateEditEdit5 Name DisplayTimeEdit
  ---- 8.数据模板。选择File/New Data Module建立数据模板LogDataModule,
放入一个Ttable组件,如图1。属性按表4设置,命名其单元为MD.pas,
存入Login目录。
  表4 数据模板中组件属性设置组件 属性 设置Table1 DatabaseName UserInfo Nam
e UsersTable TableName Users.DB
  ---- 9.创建注册窗体。选择File/New Form创建一个新窗体,
并加入组件TLabel、TEdit和TbitBtn各两个。窗体和组件属性按表5
设置,命名其单元为Login.pas,存于Login目录。
  表5 注册窗体中组件属性设置组件 属性 设置Form2 ActiveControl UserNameEdit
 Caption
请注册 Name LoginDialogForm Position poScreenCenterLabel1 Caption
用户:
  Label2 Caption 密码:
  Edit1 Name LoginNameEdit Text Edit2 Name PasswordEdit PasswordChar * Tex
t BitBtn1 Caption
注册(&L) Enabled False Kind bkOK Name LoginBitBtnBitBtn2 Caption
取消(&C) Enabled True Kind bkCancel Name CancelBitBtn
  ---- 10.选择File/New命令,从New Items的New页中选择Unit
项建一个无窗体单元Addition.pas存入Login目录,在其interface段
输入下列语句:
  uses Classes, Forms, Sysutils;type
  TApplicationUser=class(TComponent)
  private
  FUserName: string;
  FFullName: string;
  FUserGroup: Integer;
  publicproperty UserName: string readFUserName write FUserName;property
 UserFullName: string readFFullName write FFullName;property
 UserGroup: Integer readFUserGroup write FUserGroup;
  end;
  varLoginUser: TApplicationUser;
  ----在implementation段加入下列语句:
  initializationLoginUser:=TapplicationUser.Create(Application);
  ---- 11.创建注册窗体(LoginDialogForm)的OnCreate事件处理
程序。在private段中声明CountDown为Integer变量,作为计数器,
并将下述语句插入begin与end之间:
  
  CountDown:=3;   //允许尝试注册3次
  ---- 12.建立用户名输入框(LoginNameEdit)的OnChange事件处
理程序,使窗体LoginDialogForm创建时注册按钮为灰色,用户输入
登录名后才可用。不难实现,源代码略。
  ---- 13.创建注册过程。双击注册按钮(LoginBitBtn),在begin
和end之间输入其OnClick事件处理程序代码:
  ModalResult:=mrNone;try
  Session.AddPassword('UserPassword');
  LogDataModule.UsersTable.Open;
  //注册信息处理
  if not LogDataModule.UsersTable.FindKey
  ([LoginNameEdit.Text,PasswordEdit.Text]) then
  begin
  //处理注册次数
  dec(CountDown);
  if CountDown< =0 then ModalResult:=mrCancel else
  begin
  MessageBeep($FFFF);
  Application.MessageBox('请您重试一次!',
  '无效注册信息',mb_iconstop+mb_OK);
  //重设输入焦点
  LoginNameEdit.SetFocus;
  end;
  exit;
  end;
  //检查注册允许值
  if not LogDataModule.UsersTable.FieldByName
  ('Enabled').AsBoolean then
  begin
  MessageBeep($FFFF);
  Application.MessageBox( '抱歉,您不能进入系统!',
  '使用权限终止',mb_iconexclamation+mb_OK);
  ModalResult:=mrCancel;
  exit;
  end;
  //获取注册用户信息
  with LogDataModule do
  begin
  LoginUser.UserName:=UsersTable.
  FieldByName('Name').AsString;
  LoginUser.UserFullName:=UsersTable.
  FieldByName('Fullname').AsString;
  LoginUser.UserGroup:=UsersTable.
  FieldByName('Group').AsInteger;
  End;
  ModalResult:=mrOK;//关闭表,清除密码finally
  LogDataModule.UsersTable.Close;
  Session.RemovePassword('UserPassword');end;
  ---- 14.在Main.pas单元的uses中加入"Addition",在Login.pas
单元的implementation段增加uses语句:
  
  uses
  MD, Addition;
  ---- 15.打开过程文件Register.dpr,在uses语句中加入"Controls",
将"Application.run;"改为下列语句,只有注册成功时才启动系统,
同时释放注册窗体,以确保安全和减少内存占用。
  
  if LoginDialogForm.ShowModal=mrOK then
  begin
  LoginDialogForm.Free;
  Application.Run;
  end;
  ---- 16.编译、运行。注册窗口见图2,输入用户名和密码后点"
注册"按钮。
  ----如果注册信息有误,系统出现提示框,允许重新注册,见图3
。若三次尝试均不成功,注册窗口将保护性关闭。
  ----访问权已被管理员终止的用户(Enabled的值为False),例
如用户User1以口令CCCCCC注册至用户组1,系统拒绝进入,见图4。
  ----注册成功后将启动系统主程序。例如用户Supervisor以口令AAAAAA
注册,见图5。
  ----上述方案具有以下特点:
  ---- 1.Supervisor用户具有至高无上的权利,由系统创建,不
能删除,仅Password和Fullname字段的值允许自行修改。主要负责系
统维护和用户帐户管理等工作,是系统的永久性特权用户。
  ---- 2.确保用户帐户表Users.DB的安全致关重要,本方案采用
了较为可靠的关键性技术,就是注册过程(见步骤13)中"try…finally…end"
结构的应用。仅当用户按下"注册"按钮时,注册模块转送表Users.DB
的密码并将其打开,以处理注册信息。而无论成功与否,在finally
部分都能及时关闭表Users.DB,并立即清除内存中的密码。
  ---- 3.用户帐户管理模块设在主程序中,完成表Users.DB的维
护功能,包括建立用户帐户和用户组,增、删用户,分配访问权限等
。只有Supervisor或其授权用户才可进入。
  ---- 4.组帐户管理:用户按不同级别分组,再按组进行权限分
配,以简化管理。如系统可根据登录用户所属的用户组,十分方便地
屏蔽相应菜单项,以达到限制用户使用权限的目的。对用户群大的系
统,此项技术的优越性尤为显著。
  ---- 5.默认帐户限制:建立用户帐户时,系统默认其Group=3,
仅具备浏览有限信息之权限,不致因管理员一时疏忽使新建用户越权
使用,危及系统安全。
  ---- 6.单独帐户限制:用户注册时,必须提供完整的个人有效
信息才能进入系统。
  ---- 7.注册允许限制:管理员可随时取消或恢复单个用户、用
户组甚至系统所有用户(Supervisor除外)的注册权限,只需设置注
册允许字段Enabled的值为False或True。
  ---- 8.非法入侵限制:三次注册尝试不成功便保护性关闭注册
窗口,以防非法非法入侵者无限制尝试。
  ----本文介绍了应用软件注册安全性问题的综合解决方案,容易
实现,便于扩充--如增加注册时间限制和记帐收费功能等,可建立较
完善的注册安全机制,适合大型商用软件开发。
  
--
 .  生命的意义在于   /\   ____\ /\_ \   /\_\         强烈抗议北约野蛮行径!  . 
 .      希望、       \ \  \___/_\/\ \   \/_/__     __    _ _★   保卫和平!  . 
 .      工作、        \ \   ____\\ \ \    /\  \  /'__`\ /\`'_\   打倒北约!  . 
 .    爱你的人、       \ \  \___/ \ \ \___\ \  \/\  __//\ \ \/   振兴中华!  . 
 .   和你爱的人         \ \___\    \ \_____\ \__\ \____\ \ \_\   还我同胞!  . 
 .      ……             \/___/     \/_____/\/__/\/____/  \/_/ @126.com      . 
※ 修改:.haojs 于 Sep  4 16:11:26 修改本文.[FROM: bbs.hit.edu.cn]
--
※ 转寄:.武汉白云黄鹤站 bbs.whnet.edu.cn.[FROM: bbs.hit.edu.cn]

--
☆ 来源:.哈工大紫丁香 bbs.hit.edu.cn.[FROM: haojs.bbs@bbs.whnet.]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:4.064毫秒