软件的安全性
来源:互联网 发布:科研项目管理系统源码 编辑:程序博客网 时间:2024/05/12 06:41
软件的安全性是个永恒的话题,一直困扰着人们,程序员们常常因此熬夜。Novell 公司的网络操作系统NetWare 以其完善可靠的安全管理机制著称,为实现用户登录的安全性和防止非法入侵者闯入,系统提供了几种有效的限制措施和检测功能。本文讨论如何建立完善的软件注册安全机制,有效地管理用户登录,为应用软件提供可靠的保护,并在Delphi下实现。
Delphi 作为一个优秀的编程工具,功能极其强大,令开发周期大大缩短,
生成的代码运行速度快,使得Windows 软件设计成为一种乐趣。基本思路是:
建立Paradox 格式的用户帐户表Users.DB,并加密保护,由管理员维护。
预先在此表中登记并有注册权限的用户,可持本人有效口令登录进入系统。
实现步骤如下:
1 .在应用软件主目录(假设为C:/Register)下创建两个子目录,
分别命名为Login 和Data。
2 .从Delphi 的Tools 菜单中启动Database Desktop,并选择Tools/AliasManager …
创建一个新别名。方法是:在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),然后关闭DatabaseDesktop。
表2 表Users.DB 的样本用户
Name Password Fullname Group Enabled
Supervisor AAAAAA Super User 0 True
Director BBBBBB Director User 1 True
Guest 3 True
User1 CCCCCC General User1 1 False
User1 DDDDDD General User1 2 True
User2 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
Position poScreenCenter
GroupBox1 Caption 用户信息
Label1 Caption 用户名称:
Label2 Caption 用户全名:
Label3 Caption 用户组号:
Label4 Caption 登录日期:
Label5 Caption 登录时间:
Edit1 Name NameEdit
Edit2 Name FullnameEdit
Edit3 Name GroupEdit
Edit4 Name DisplayDateEdit
Edit5 Name DisplayTimeEdit
8 .数据模板。选择File/New Data Module 建立数据模板LogDataModule,放入一个Ttable 组件,如图1。属性按表4 设置,命名其单元为MD.pas,存入Login 目录。
表4 数据模板中组件属性设置
组件属性设置
Table1 DatabaseName UserInfo
Name UsersTable
TableName Users.DB
9 .创建注册窗体。选择File/New Form 创建一个新窗体,并加入组件TLabel、TEdit 和TbitBtn 各两个。窗体和组件属性按表5 设置,命名其单元为Login.pas,存于Login 目录。
表5 注册窗体中组件属性设置
组件属性设置
Form2 ActiveControl UserNameEdit
Caption 请注册
Name LoginDialogForm
Position poScreenCenter
Label1 Caption 用户:
Label2 Caption 密码:
Edit1 Name LoginNameEdit
Text
Edit2 Name PasswordEdit
PasswordChar *
Text
BitBtn1 Caption 注册(&L)
Enabled False
Kind bkOK
Name LoginBitBtn
BitBtn2 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;
public
property UserName: string read
FUserName write FUserName;
property UserFullName: string read
FFullName write FFullName;
property UserGroup: Integer read
FUserGroup write FUserGroup;
end;
var
LoginUser: TApplicationUser;
在implementation 段加入下列语句:
initialization
LoginUser:=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 .非法入侵限制:三次注册尝试不成功便保护性关闭注册窗口,以防非法非法入侵者无限制尝试。
本文介绍了应用软件注册安全性问题的综合解决方案,容易实现,便于扩充-- 如增加注册时间限制和记帐收费功能等,可建立较完善的注册安全机制,适合大型商用软件开发。
- 软件的安全性
- 防泄密软件的安全性
- 软件安全性测试的列表
- 从Bundle安全性谈软件和数据的安全性
- 如何评测软件系统的安全性
- 如何评测软件系统的安全性
- 软件系统的安全性和保密性
- 关于开源软件安全性的探讨
- 软件安全性测试设计的基本原则
- 软件安全性测试模板
- 软件安全性服务
- 软件安全性测试
- 关于软件安全性测试
- 软件安全性检查checklist
- 软件安全性测试
- 软件的安全性应从哪几个方面去测试?
- 关于加密软件中存在的安全性隐患问题分析
- 有些服务器安全软件自身的安全性都很脆弱
- Linux下Squid3.0反向代理的安装与配置
- 关于水晶报表长字段自动换行的最佳处理办法
- 异常
- sql*plus下远程连接oracle数据库
- Aix topas命令解析
- 软件的安全性
- E65上可以用的UCWEB 6.7 正式版,HTTP下载。
- C#线程类Thread初步
- MySQL中常用日期时间函数及获得
- 程序加密方法
- 提取硬盘ID号
- 短信中心号码
- 在Java中模拟多重继承--扩展多个类的技巧
- [总结]配置Apache2.2负载平衡+Tomcat6集群 [转]