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

實用 PHP MySQL 資料庫連線類:內建防注入與表結構管理

     編輯:PHP 相關知識

類別設計亮點

這個 mysql 類別封裝了連線管理、查詢執行、資料抓取、寫入操作、表結構檢查等核心功能,並內建SQL 關鍵字過濾與XSS 防護,適合中小型專案快速開發。

核心功能模組

1. 連線管理與字符集設定

function __construct($hostname, $username, $userpwd, $database, $pconnect=false, $charset='utf8') {
    $this->pconnect = $pconnect;
    $this->dblink = $pconnect 
        ? mysql_pconnect($hostname, $username, $userpwd)
        : mysql_connect($hostname, $username, $userpwd);
    
    if (!$this->dblink) fatal_error("資料庫連線失敗!");
    
    mysql_unbuffered_query("SET NAMES {$charset}");
    if ($this->version() > '5.0.1') {
        mysql_unbuffered_query("SET SQL_MODE = ''");
    }
    mysql_select_db($database) or fatal_error("無法選擇資料庫!");
}

2. 內建 SQL 注入關鍵字過濾

類別屬性定義了危險模式替換規則:

private $search = array(
    '/union\s*(/\*.*\*/)?\s*select/i',
    '/load_file\s*(/\*.*\*/)?\s*\(/i',
    '/into\s*(/\*.*\*/)?\s*outfile/i'
);
private $replace = array(
    'union   select',
    'load_file   (',
    'into   outfile'
);

⚠️ 注意:此為正則替換式過濾,屬「黑名單機制」,無法防禦所有變形攻擊。生產環境強烈建議改用 PDO 預處理語句。

3. 通用查詢與資料抓取

function query($sql, $unbuffered=false) {
    $this->rs = $unbuffered 
        ? mysql_unbuffered_query($sql, $this->dblink)
        : mysql_query($sql, $this->dblink);
    if (!$this->rs) fatal_error("SQL 執行錯誤: " . mysql_error());
    return $this->rs;
}

function fetch_all($sql) {
    $this->query($sql);
    $result = array();
    while ($rows = mysql_fetch_array($this->rs, MYSQL_ASSOC)) {
        $result[] = $rows;
    }
    mysql_free_result($this->rs);
    return $this->filter_pass($result); // 經過 XSS 過濾
}

4. 安全寫入操作(含欄位存在性檢查)

function insert($tbname, $varray, $replace=false) {
    $varray = $this->escape($varray); // 內建 real_escape_string + 關鍵字過濾
    $tb_fields = $this->get_fields($tbname); // 獲取真實欄位列表
    
    foreach ($varray as $key => $value) {
        if (in_array($key, $tb_fields)) { // 僅允許存在的欄位
            $fields[] = "`{$key}`";
            $values[] = is_string($value) ? "'{$value}'" : $value;
        }
    }
    // 組裝並執行 SQL...
}

5. 表結構管理功能

  • get_fields($table):獲取指定表所有欄位名
  • get_table_status($database):獲取資料庫所有表狀態(大小、引擎、行數等)
  • get_tables():列出所有表名
  • create_model_table() / create_table():快速建立內容/會員模型表
  • create_fields():動態新增欄位

6. XSS 過濾器 filter_pass()

支援白名單標籤(allowed_htmltags)與事件屬性黑名單(onload、onclick 等 100+ 危險屬性),對陣列遞迴處理,適合富文本內容淨化。

遷移建議:從 mysql_* 到 PDO

PHP 7.0+ 已移除 mysql_* 擴展。建議重構為 PDO 版本:

class Database {
    private $pdo;
    
    public function __construct($dsn, $user, $pass) {
        $this->pdo = new PDO($dsn, $user, $pass, [
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
            PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
            PDO::ATTR_EMULATE_PREPARES => false // 真實預處理
        ]);
    }
    
    public function query($sql, $params = []) {
        $stmt = $this->pdo->prepare($sql);
        $stmt->execute($params);
        return $stmt;
    }
    
    // 其餘方法改用 $stmt->fetchAll() 等...
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved