📄 建立应用软件注册安全机制 (2001年4月8日).txt
字号:
建立应用软件注册安全机制 (2001年4月8日)
网友更新 分类:数据库 作者: winfit(推荐) 推荐:winfit 阅读次数:376
(http://www.codesky.net)
--------------------------------------------------------------------------------
软 件 的 安 全 性 是 个 永 恒 的 话 题, 一 直 困 扰 着 人 们, 程 序 员 们 常 常 因 此 熬 夜。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 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 . 非 法 入 侵 限 制: 三 次 注 册 尝 试 不 成 功 便 保 护 性 关 闭 注 册 窗 口, 以 防 非 法 非 法 入 侵 者 无 限 制 尝 试
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -