首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP+DBM 同學錄(四):會員註冊 reg.php3 與資料庫初始化 run.php3

     編輯:PHP 綜合知識

reg.php3 — 會員註冊完整流程

  1. 引入共用庫:require("common.php3")(錯誤處理)、require("mail.php3")(發信函數)。
  2. 表單提交判斷:檢查 $submit 變數(舊式 register_globals 風格)。
  3. 伺服端驗證(依序):
    • 用戶名 $id 不可空、僅允許英數字(eregi("^[0-9a-zA_Z]+$"),eregi 已棄用)。
    • 密碼 $password 不可空、兩次輸入一致($password1)。
    • 真實姓名 $name、Email $mail 必填。
  4. DBM 寫入:
    • dbmopen("class", "w") 開啟會員資料庫(寫入模式)。
    • dbmexists() 檢查用戶名是否已存在。
    • 將 12 個欄位以 |!:!| 串接成單一字串 $data,dbminsert($dbm, $id, $data) 存入。
    • 另開 dbmopen("password", "w") 以 dbminsert($pwd, $id, $password) 存明文密碼(極度不安全)。
  5. 發送歡迎信:組裝含帳密、所有註冊資訊的長字串 $sendmsg,呼叫 mail2() 寄送至註冊 Email。
  6. 導向首頁:header("Location:index.php3")。
  7. GET 請求顯示表單:輸出含 15 欄位的註冊表單(用戶名、密碼、確認密碼、NickName、Email、OICQ、主頁、ICQ、姓名、電話、生日、地址、職業下拉、性別下拉、個人簡介 textarea),提交至自身 reg.php3。

run.php3 — 一鍵建立 DBM 檔案

$dbm = dbmopen("class", "c");  // "c" = create if not exists
dbmclose($dbm);
$dbm = dbmopen("password", "c");
dbmclose($dbm);

僅建立空的 class.db、password.db(或 .dir/.pag 視處理器而定),供後續註冊寫入使用。

安全性與技術債

問題風險修正方向
明文密碼存儲資料庫洩露即帳號全失陷改用 password_hash(),僅存雜湊
ereg/eregi 已棄用PHP 7+ 直接報錯改用 preg_match('/^[a-zA-Z0-9]+$/')
register_globals 依賴變數汙染、安全性極差改用 $_POST/$_GET 顯式取值
DBM 無並發鎖多用戶同時註冊可能損壞檔案遷移至 SQLite/MySQL/PostgreSQL
Email 內含明文密碼郵件傳輸過程可被竊聽改發「設定密碼連結」,不寄密碼
分隔符 |!:!| 衝突使用者輸入含該字串導致解析錯誤改用 JSON/serialize 結構化存儲

現代化重寫骨架 (PDO + SQLite 範例)

$pdo = new PDO("sqlite:class.db");
$pdo->exec("CREATE TABLE IF NOT EXISTS members (
  id TEXT PRIMARY KEY, name TEXT, nickname TEXT, email TEXT, home TEXT,
  oicq TEXT, icq TEXT, address TEXT, tel TEXT, birth TEXT, job TEXT,
  intro TEXT, sex TEXT, pwd_hash TEXT, created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)");

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
  // 驗證 $_POST 欄位...
  $hash = password_hash($_POST['password'], PASSWORD_DEFAULT);
  $stmt = $pdo->prepare("INSERT INTO members (id,name,nickname,email,home,oicq,icq,address,tel,birth,job,intro,sex,pwd_hash) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
  $stmt->execute([$_POST['id'], $_POST['name'], $_POST['nickname'], $_POST['mail'], $_POST['home'], $_POST['oicq'], $_POST['icq'], $_POST['add'], $_POST['tel'], $_POST['birth'], $_POST['job'], $_POST['intro'], $_POST['sex'], $hash]);
  // 發送設定密碼郵件(含一次性 token)...
  header("Location: index.php");
  exit;
}
// 輸出 HTML 表單...
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved