早期開源項目 phpfans 留言板 v1.0 的安裝向導代碼,包含數據庫創建、表結構初始化、默認數據插入、配置文件寫入。本文解析其流程並指出安全隱患。
mysql_connect 驗證連接 → CREATE DATABASE IF NOT EXISTSSET NAMES 'gbk' (MySQL 4.1+ 判斷)post (留言主表) / reply (回覆表) — MyISAM、gbkinclude/config.php 配置文件 (含 DB 憑證、管理員帳密、分頁大小)
7. 提示刪除 install.php、進入首頁
<?php
// 1. 連接驗證
$conn = @mysql_connect('localhost', $mydbuser, $mydbpw);
if (!$conn) exit('MySQL 用戶名或密碼不正確');
// 2. 創建數據庫
mysql_query("CREATE DATABASE IF NOT EXISTS `$mydbname`");
mysql_select_db($mydbname);
// 3. 字符集兼容 (MySQL 4.1+)
$char = '';
if (mysql_get_server_info() > '4.1') $char = 'DEFAULT CHARSET=gbk';
// 4. 創建表 post
$sql = "CREATE TABLE `post` (
`p_id` INT(255) UNSIGNED NOT NULL AUTO_INCREMENT,
`p_name` VARCHAR(20) NOT NULL,
`p_email` VARCHAR(20) NOT NULL,
`p_qq` VARCHAR(20) NOT NULL,
`p_homepage` VARCHAR(100) NOT NULL,
`p_image` VARCHAR(8) NOT NULL,
`p_title` VARCHAR(160) NOT NULL,
`p_content` MEDIUMTEXT NOT NULL,
`p_ip` VARCHAR(15) NOT NULL,
`p_date` DATETIME NOT NULL,
PRIMARY KEY (`p_id`)
) ENGINE=MyISAM $char";
mysql_query($sql);
// 5. 初始數據
mysql_query("INSERT INTO `post` VALUES (1, '我不是魚', 'deng5765@163.com', '245821218',
'https://www.phpfans.net', '01', '感謝使用...', '內容...', '127.0.0.1', NOW())");
// 6. 寫入配置文件
$str = "<?php\n";
$str .= "\$mydbhost = 'localhost';\n";
$str .= "\$mydbuser = '$mydbuser';\n";
$str .= "\$mydbpw = '$mydbpw';\n";
$str .= "\$mydbname = '$mydbname';\n";
$str .= "\$mydbcharset = 'gbk';\n";
$str .= "\$admin = '$_POST[m_admin]';\n";
$str .= "\$adminpw = '$_POST[m_adminpw]';\n"; // ❌ 明文存儲密碼
$str .= "\$eachpage = 5;\n";
$str .= "?>";
file_put_contents('include/config.php', $str);
| 隱患 | 代碼位置 | 風險 | 修復 |
|---|---|---|---|
| 管理員密碼明文存儲 | $adminpw = '$_POST[m_adminpw]' | 配置文件洩露即帳號接管 | 存儲 password_hash() 雜湊值 |
| SQL 注入 (表名/數據庫名) | CREATE DATABASE $mydbname 直接拼接 | 惡意數據庫名執行任意 SQL | 白名單驗證 / 反引號包裹 / 預處理不支援 DDL |
| 無 CSRF Token | 安裝表單無防偽 | 誘導管理員重複安裝覆蓋配置 | Session Token 驗證 |
| 安裝後未強制刪除 | 僅提示「請刪除」 | 重裝覆蓋、信息洩露 | 安裝成功自動 unlink(__FILE__) 或重定向鎖定 |
| 錯誤信息洩露 | echo mysql_error() | 路徑、結構信息外洩 | 生產關閉 display_errors、記錄日誌 |
| 使用已棄用 mysql_* 函數 | 全文 | PHP 7.0+ 不可用 | 遷移 PDO / mysqli |
password_hash($_POST['adminpw'], PASSWORD_DEFAULT)chmod 600、存放於 Web 根目錄外.env + vlucas/phpdotenv,不入版本庫touch('install.lock'),存在即禁止訪問安裝頁原項目官網 phpfans.net 已不可訪問,代碼僅供歷史研究。現代留言板/評論系統建議使用 **Disqus / Gitalk / Valine / Twikoo** 等第三方服務,或成熟開源 **Commento / Isso / Remark42** 自建。