说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

建立应用软件注册安全机制-Delphi资料

HTML文档下载 WORD文档下载 PDF文档下载
建立应用软件注册安全机制-Delphi资料

软 件 的 安 全 性 是 个 永 恒 的 话 题, 一 直 困 扰 着 人 们, 程 序 员 们 常 常 因 此 熬 夜。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 . 非 法 入 侵 限 制: 三 次 注 册 尝 试 不 成 功 便 保 护 性 关 闭 注 册 窗 口, 以 防 非 法 非 法 入 侵 者 无 限 制 尝 试。

思科为什么愿意花12亿美元收购云计算网络初创公司Meraki? 谷歌有麻烦了!联邦贸易委员会正调查其搜索业务 当数据中心遭遇污水 微软新能源数据中心的诞生 2012vForum:更加注重开发者 腾讯赵伟:Hive在腾讯分布式数据仓库的实践 Apple将在2013年启动香港数据中心的建设 顶级域名扩张受阻:ICANN透露部分域名存争议 硅谷创业教父Paul Graham:如何获得创业好点子? GDC2012特别报道:中西方游戏开发思想在这里融合 应用示例和对象是编程的未来吗? 为什么2012年HTML5发展远未达预期 当程序不再工作时,程序员说 独立游戏开发者易犯的9大致命错误 “Do Not Track”的前世今生 《Warcraft是怎样炼成的(三)》:从Demo到游戏 无限强大的超级马里奥AI 以Google第二代数据库产品MegaStore为理论模式 探索HBase系统 传Google明年推Chrome OS触摸屏上网本 下载自己过去的Tweets?用户准备好了吗? 微软任命研究部门新副总裁 负责北京等实验室 欧朋首席标准官:HTML5将在2014年成熟 开发利器:对游戏开发者最具价值的5类iOS应用 专访前IE浏览器内核研发工程师,带你深入了解IE10 Windows 8市场接纳速度慢于Windows 7 别只看下载量!“用户留存率”才是关键! 预计2020年出现百亿亿次级超级计算机 Google数据中心PUE的秘密 一个传奇:有个人不断赢得世界算法冠军 音乐能力开放平台合作探索之旅 社交网络海外营销技巧及工具实战 大数据谬误 —— 为什么我们需要收集更多的数据 有关Win2K Pro+JBuilder5+Weblogic6+JDK1.3环境下调试jsp遇到的问题,希望大家能帮忙解答一下 求教.计算机专业的应届生怎样才可去游戏公司? 如何对APPLET存档? 请问这样一条select语句(包含compute)的查询结果怎么显示在屏幕上? 请问如何实现一个类似于工具提示的小窗口,并控制它的显示,或者怎样让工具提示窗口一直显示 请教各位高手关于对象序列化的问题! 现在很急切,多谢各位! 送分:如何求一个已打开ADO记录集中当前记录的行号或索引? enhydra4.0+jbuilder4.0+kelp4.0. 类型不匹配? 请教各位高手关于对象序列化的问题! 现在很急切,多谢各位!-- 请问这条select语句(包含compute)的结果如何显示在屏幕上? cn类型不匹配? 请问高手: 如何在VB.NET中调用象GetObject那样的函数 300分!!急急急!!各位大虾有提供关于报表的控件带源码的 请问各位大侠,怎么用批处理的方式开启一个后台服务程序? 如何对access文件加密!!!! 再次送分:如何求一个已打开ADO记录集中当前记录的行号或索引? 急!急!在用户界面线程中,如何接收其它窗口发送的消息? 我的toolbar潜入一个对话筐怎么是灰的???? :)请问:网上能不能找到破解了的Pro-e2000(中文版)啊? 关于退格键! java与C的问题,怎么办? VC里如何调用std里的operator new和operator delete 有沒辦法使成員函數只供指定的 class 呼叫! 关于DELPHI中的DBGRID控件 关于enhydra4.0+kelp4.0+jbuilder4.0。 能不能用Mscomm控制并口,如果行,应该怎样将一串ASCII值发送到并口;如果不行,能用其它方式吗?(最好能提供例程)多谢了。 求救,请教ado中有关事务的问题。 异想天开的问题???,进来就给分!!!! 请教高手,我如何将*.swf文件从网下摘下? 集线器与交换机怎样级联? 请问如何用RasDial 类似冰河“搜索主机”的功能怎么实现啊? 如何利用socket截获80端口数据?请给出源代码。 水晶报表的问题 Help的窗口 送分:关于数据库中的数据在前台显示的问题,敬请高手指教 请问一下各位PB FANS,PB中的自定义事件中的extenal选项有何作用? Label的小问题,以后给分,现在确实没分了。 测试a 有沒辦法使成員函數只供指定的 class 呼叫! 请问如何给listview添加鼠标拖拽功能,如从本视图中拖走一行? Jbuild and Visual Age for Java 只使用数据库表单如何不带环境? 为什么在Cmd.exe 下可以运行,但是在ASP里面却没有办法写进数据???斑竹怎么只提供4页的讨论内容呢?? 救急,启动winNT时候inetinfo.exe总是共享冲突,该咋解决? 如何防止内存泄漏 帮忙看诊断一下遇到的问题。 Fatal error C1010: unexpected end of file while looking for precompiled header directive是什么意思?怎么改正? 关于数据窗口 D3D8的疑問 三价铁离子和硫氰根离子反应生成物用加沉淀符号吗? 就是实验题回答的那些 干燥剂(硅胶)遇水以后为什么会弹起来? 棕色试剂瓶不用棕色试剂瓶存放的是()A氯水 B溴化银 C碘化银D氟化钠 亚铁离子与硫氰酸钾反应据说生成物是蓝色的! 二价Fe和S离子是双水解还是生成沉淀 三价铁离子的硫氰根络合物能与铁单质反应吗?还有一个……Fe3+能表示Fe(SCN)3么? 月季花汁和玫瑰花汁遇白醋、肥皂、苹果汁分别变成什么颜色? 不同成分的干燥剂遇水反应是否会有不同? 初中化学有哪些实验 为什么白醋、肥皂水能使月季花汁和玫瑰花汁变色?鸡毛信急! 干燥剂遇水会爆炸吗? 初中化学的实验有哪些 硫氰酸钾和氯化铁溶液反应方程式怎么写? 干燥剂为什么遇到水会跳?干燥剂是"雅客益牙木糖醇"里面的,是透明的小圆珠,我把这些干燥剂全部防竟烟灰缸,然后加了一些茶水,它们就全部都跳了起来,它们会不会和跳跳糖的成分一样啊? 二价铁离子为什么不可与二价硫离子共存 谁有初中化学基本实验操作复习题呀? 干燥剂和水的反应.急用! 3价铁为什么和硫离子不共存?是因为氧化还原反应还是双水解?为什么?主要是为什么 1水无色,为什么结成冰变成了白色?2高空中的水蒸气是无色,为什么凝华后变成的雪是白色?3空气中是有水蒸气还是有水蒸汽? 向下排空气法的适用条件除了对气体密度有要求外,对试验装置是否也有要求?是不是只有如图的装置才能用?如果把如图装置旋转180°,是不是就不能用向下排空气法了? 高中保存在棕色试剂瓶的所有药瓶,最好加上见光分解的化学方程或其他原因 为什么瓶子里冻的水变成冰是白色,而不是透明的··· 三、初中化学:提出实验方案?设计一个实验,能通过清晰可见的现象,除去氯化钙溶液中的少量稀盐酸,请写出实验操作过程、现象和结论? 证明空气存在(用家中日常物品) 彩色的水冻出来的冰为什么是白色或透明的?冰可能是彩色的吗?望正解,科学理念之类的. 如何针对初中化学总复习制定方案? 初中化学人教版有哪些家庭小实验 三价铁离子不能跟哪些离子共存要全一点的 盐酸可以用来分离三价铁离子和铝离子么? 家庭如何购买初中化学实验仪器 碘离子为什么不能与三价铁离子大量共存? 为什么铁与盐酸反应生成二价铁,铝与盐酸反应却生成三价铝?不是具有强氧化性,才能从零价氧化成三价? 三价铁离子、硝酸根离子、氢离子在水溶液中能否大量共存? 字数不要太多,浓缩才是精华,要分类说明,最好有口诀. 三价铝离子与水反应的方程式 有哪种无色透明化学试济遇水显颜色? 钠,铝,硫,氯离子半径谁大谁最大,谁最小 什么和什么离子对铝片和盐酸反应无影响 用什么化学物质,平时无色,见水可显黑色呢 正三价铝离子和负二价硫离子的离子半径哪个大? 干燥剂遇水多长时间爆炸 笨铵皮为什么遇水颜色变深 . 钠离子,镁离子,铝离子,氯离子,硫离子等半径由大到小顺序排列?为什么? 初中化学 这几个都要 硫氢根与碳酸氢根是否反应H2S+(CO3)2-==HS-+(HCO3)-剩下的不继续反应了吗 初中化学家庭小实验要有过程 正一价钠离子和负三价的氮离子谁的半径大 碳酸根和碳酸氢根反应的离子方程式 Fe(OH)3溶于氢碘酸的方程式怎么写?碘离子会不会把3价的Fe的铁还原成2价?Na2S2O3溶液中通入足量的氯气化学方程式怎么写?氢氧化铝中和胃酸的方程式怎么写?过量SO2通入NaOH溶液中化学方程式NaNO2 初中化学,谢谢谢谢谢谢 二价铁和碳酸根,碳酸氢根,亚硫酸氢根,偏铝酸根反应的离子方程式 “蛋壳溶于食醋放出气体”这个实验谁能说的详细一点啊 钠离子与氮离子哪个半径大 AgNO3固体见光或受热易分解,故用棕色试剂瓶保存.AgNO3受热分解,放出的有刺激性气味的气体可能是()放出的有刺激性气味的气体可能是( )A.SO2 B.NO2 C.NH3 D.N2 二价铁和硫氰酸钾反应有什么现象?注意,是”二价铁” 氧化还原反应Fe+S==加热==FeS,书上强调用干燥的试管当反应器皿,为什么要干燥?想不通~ 为什么存放硝酸银溶液用棕色试剂瓶?还有哪些存放在棕色试剂瓶? 硫氰酸钾与三价铁离子反应有无沉淀生成能在溶液中共存吗? 二价fe离子水解吗?
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn