表單驗證是 Web 應用安全的第一道防線。本文提供一個功能完整的 class_post 類別,涵欄位格式驗證(字母數字、純數字、中文、身分證、Email、電話、郵遞區號、URL)、資料庫特殊字元轉義(防 SQL Injection)、HTML 實體編碼(防 XSS)與資料還原功能,可直接整合至專案使用。
| 方法 | 用途 | 正則說明 |
|---|---|---|
fun_text1($min, $max, $str) | 字母數字組合長度驗證 | ^[a-zA-Z0-9]{min,max}$ |
fun_text2($min, $max, $str) | 純數字長度驗證 | ^[0-9]{min,max}$ |
fun_font($min, $max, $str) | 中文字長度驗證 | ^([\x81-\xfe][\x40-\xfe]){min,max}$(Big5 編碼) |
fun_status($str) | 身分證字號驗證 | 15/18 位數字或 17 碼+X |
fun_email($str) | Email 格式驗證 | 標準 RFC 5322 簡化版 |
fun_phone($str) | 電話號碼驗證 | 支援區碼、分機、手機格式 |
fun_zip($str) | 郵遞區號驗證 | 6 位數字,首位非 0 |
fun_url($str) | URL 格式驗證 | https:// 開頭,允許查詢參數 |
<?php
class FormValidator {
// 通用驗證:回傳 bool
private function check($pattern, $str) {
return (bool)preg_match($pattern, $str);
}
public function alphanumeric($min, $max, $str) {
return $this->check("/^[a-zA-Z0-9]{{$min},{$max}}$/", $str);
}
public function numeric($min, $max, $str) {
return $this->check("/^[0-9]{{$min},{$max}}$/", $str);
}
public function chinese($min, $max, $str) {
// 建議改用 UTF-8 正則:/^[\x{4e00}-\x{9fa5}]{$min,$max}$/u
return $this->check("/^([\x81-\xfe][\x40-\xfe]){{$min},{$max}}$/", $str);
}
public function idCard($str) {
return $this->check('/^\d{15}|\d{18}|\d{17}[xX]$/', $str);
}
public function email($str) {
return $this->check('/^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+\.)+[a-z]{2,}$/i', $str);
}
public function phone($str) {
return $this->check('/^((\d{3,4}-)?\d{7,8})(-\d+)?$/', $str);
}
public function zipCode($str) {
return $this->check('/^[1-9]\d{5}$/', $str);
}
public function url($str) {
return $this->check('/^https?:\/\/[^\s\/$.?#].[^\s]*$/i', $str);
}
// 資料清洗:防 SQL Injection(參考用,實務建議用 PDO Prepared Statements)
public function dataJoin(&$data) {
if (!get_magic_quotes_gpc()) { // PHP 5.4+ 已移除,僅舊專案相容
$data = is_array($data) ? array_map([$this, 'dataJoin'], $data) : addslashes($data);
}
return $data;
}
// 還原資料庫資料
public function dataRevert(&$data) {
$data = is_array($data) ? array_map([$this, 'dataRevert'], $data) : stripslashes($data);
return $data;
}
// 輸出安全編碼:防 XSS
public function dataShow(&$data) {
if (is_array($data)) {
$data = array_map([$this, 'dataShow'], $data);
} else {
$data = nl2br(htmlspecialchars($data, ENT_QUOTES, 'UTF-8'));
$data = str_replace([' ', ' '], [' ', '
'], $data);
}
return $data;
}
}
?>
$v = new FormValidator();
$_POST = $v->dataJoin($_POST); // 寫入資料庫前轉義
if (!$v->email($_POST['email'])) die('Email 格式錯誤');
if (!$v->phone($_POST['phone'])) die('電話格式錯誤');
// 讀取資料庫後還原並安全輸出
$row = $db->fetchAssoc($sql);
$row = $v->dataRevert($row);
$row = $v->dataShow($row);
echo $row['content']; // 已轉換換行、跳脫 HTML 實體
addslashes/mysql_*:請改用 PDO Prepared Statements 參數綁定,徹底解決 SQL Injection。/^[\p{Han}]{$min,$max}$/u(Unicode 屬性),支援 UTF-8 且更精確。filter_var($email, FILTER_VALIDATE_EMAIL) 更可靠。htmlspecialchars($str, ENT_QUOTES, 'UTF-8'),搭配 CSP 標頭。get_magic_quotes_gpc:PHP 5.4.0 起已移除,舊專案升級時需清理相關代碼。本類別提供一站式表單驗證與資料處理解決方案,適合快速原型或維護舊專案。新專案強烈建議採用 PHP 內建 filter 函式、PDO 及 成熟驗證套件(如 Respect/Validation, Symfony Validator),確保安全性與可維護性。