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

PHP 表單驗證完整類別實作:正則驗證、資料清洗與 XSS 防護

     編輯:PHP 相關知識

前言

表單驗證是 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(['&nbsp;', ' '], [' ', '
'], $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 實體

四、現代化改進建議(重要)

  1. 棄用 addslashes/mysql_*:請改用 PDO Prepared Statements 參數綁定,徹底解決 SQL Injection。
  2. 正則優化:中文驗證請使用 /^[\p{Han}]{$min,$max}$/u(Unicode 屬性),支援 UTF-8 且更精確。
  3. Email 驗證:PHP 內建 filter_var($email, FILTER_VALIDATE_EMAIL) 更可靠。
  4. XSS 防護:輸出時統一使用 htmlspecialchars($str, ENT_QUOTES, 'UTF-8'),搭配 CSP 標頭。
  5. 移除 get_magic_quotes_gpc:PHP 5.4.0 起已移除,舊專案升級時需清理相關代碼。

五、總結

本類別提供一站式表單驗證與資料處理解決方案,適合快速原型或維護舊專案。新專案強烈建議採用 PHP 內建 filter 函式、PDO 及 成熟驗證套件(如 Respect/Validation, Symfony Validator),確保安全性與可維護性。

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