首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 建立軟體註冊安全機制:Paradox 資料表 + 角色權限 + 登入防暴力破解完整實作

     編輯:Delphi

商業軟體必須解決「誰能用、能用多久、能用什麼功能」的授權問題。本文示範在 Delphi 3/5/7 環境下,以加密 Paradox 資料表 (Users.db) 為核心,建立含使用者帳號、密碼雜湊、角色分組 (系統管理員/操作員/一般用戶/瀏覽者)、啟用/停用旗標、登入失敗鎖定 (3 次) 的完整註冊/登入機制,並採用資料模組分離、介面物件封裝、專案來源修改等工程化實踐。

架構概覽

  • 資料層:Login\Data\Users.db (Paradox 5.0, 密碼保護)
  • 資料模組:Login\MD.pas (TDataModule + TTable)
  • 登入介面:Login\Login.pas (TForm + TEdit/TBitBtn)
  • 使用者物件:Login\Addition.pas (TApplicationUser 封裝登入後資訊)
  • 主程式:Register.dpr 控制登入成功才 Application.Run

資料表結構 (Users.db)

欄位型別大小鍵說明
NameAlpha16PK使用者帳號
PasswordAlpha16PK登入密碼 (明文示範,生產環境必須存雜湊)
FullNameAlpha32顯示名稱
GroupInteger角色:0=超管, 1=操作員, 2=一般, 3=瀏覽
EnabledLogical帳號啟用狀態

預設值:Group=3, Enabled=True。非空限制:Name, Group, Enabled。

核心登入邏輯 (LoginBitBtn.OnClick)


procedure TLoginDialogForm.LoginBitBtnClick(Sender: TObject);
begin
  ModalResult := mrNone;
  try
    Session.AddPassword('UserPassword'); // 解密資料表
    LogDataModule.UsersTable.Open;

    // 1. 驗證帳號/密碼 (複合鍵查找)
    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;

    // 2. 檢查啟用狀態
    if not LogDataModule.UsersTable.FieldByName('Enabled').AsBoolean then
    begin
      Application.MessageBox('抱歉,您不能進入系統!', '使用權限終止', MB_ICONEXCLAMATION + MB_OK);
      ModalResult := mrCancel; Exit;
    end;

    // 3. 取得使用者資訊填入全域物件
    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;
end;

專案來源控制流程 (Register.dpr)


begin
  Application.Initialize;
  Application.CreateForm(TLoginDialogForm, LoginDialogForm);
  if LoginDialogForm.ShowModal = mrOK then
  begin
    LoginDialogForm.Free; // 釋放登入視窗資源
    Application.CreateForm(TMainForm, MainForm);
    Application.Run;
  end;
end.

主視窗啟動顯示使用者資訊 (MainForm.OnActivate)


procedure TMainForm.FormActivate(Sender: TObject);
begin
  Caption := IfThen(Time < StrToTime('12:00:00'), '上午好,您已成功登錄!', '下午好,您已成功登錄!');
  NameEdit.Text := LoginUser.UserName;
  FullNameEdit.Text := LoginUser.UserFullName;
  GroupEdit.Text := IntToStr(LoginUser.UserGroup);
  DisplayDateEdit.Text := DateToStr(Date);
  DisplayTimeEdit.Text := TimeToStr(Time);
end;

安全性關鍵設計點

  1. 資料表密碼只在驗證瞬間載入記憶體:try...finally 確保 Session.RemovePassword 必執行,防止記憶體掃描竊取。
  2. 複合主鍵 (Name+Password) 防止撞庫:FindKey 直接定位,不遍歷全表。
  3. 角色預設最低權限 (Group=3):新增帳號預設僅可瀏覽,避免管理員疏忽授權過高。
  4. 三次失敗鎖定視窗:CountDown 計數器,歸零設 ModalResult=mrCancel 關閉登入視窗。
  5. 管理員帳號 (Supervisor) 內建不可刪除:負責帳號維護、權限分配、系統設定。
  6. 啟用旗標 (Enabled) 即時生效:管理員可隨時凍結單一帳號、整組角色或全系統 (超管除外)。

擴充方向

  • 密碼改存 SHA-256/BCrypt 雜湊,登入時驗證雜湊而非明文比對。
  • 加入 LastLogin, LoginCount, ExpireDate 欄位實作授權期限。
  • 整合硬體鎖 (USB Key) 或機器碼綁定。
  • 登入日誌記錄 (IP、時間、成功/失敗) 供稽核。
  • 改用 SQLite/Firebird/嵌入式資料庫取代 Paradox,提升跨平台部署能力。

小結

本方案雖基於經典 Paradox + BDE 架構,但其核心思想 — — **資料加密、最小權限預設、登入防暴力、角色基礎存取控制 (RBAC)、關鍵資源即用即釋** — — 完全適用於現代 Delphi (FireDAC + SQLite/PostgreSQL) 甚至跨語言 (C#/Java) 的授權系統設計。工程化分層 (資料模組、介面物件、專案入口控制) 更是中大型專案可維護的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved