在 Web 開發中,表單透過 POST 或 GET 方式送資料到後端是再常見不過的操作。然而,當使用者輸入包含雙引號 "、單引號 ' 或反斜線 \ 等特殊字元時,若處理不當,極易導致資料儲存錯誤、JSON 解析失敗,甚至引發安全漏洞。本文將系統整理 PHP 處理這類特殊字元的最佳實踐,幫助開發者建立穩健的資料流程。
早期 PHP(5.3 之前)若在 php.ini 啟用 magic_quotes_gpc = On,會自動對 $_GET、$_POST、$_COOKIE 資料執行 addslashes() 轉義。但此機制因副作用過多(如重複轉義、影響非資料庫操作),已於 PHP 5.3 棄用、5.4 移除。現代 PHP 專案必須自行負責轉義邏輯,不可仰賴已移除的功能。
針對表單提交資料,建議遵循以下標準化流程:
stripcslashes() 移除可能已存在的反斜線,避免雙重轉義。addslashes() 將特殊字元加上反斜線,安全寫入資料庫。stripcslashes() 還原原始字串。json_encode(),再以 addslashes() 二次轉義,確保 JavaScript 安全解析。| 函數 | 用途 | 典型使用時機 |
|---|---|---|
addslashes() | 在特殊字元前加反斜線 | 寫入資料庫前、JSON 輸出前 |
stripcslashes() | 移除 addslashes() 加上的反斜線 | 讀取資料庫後、JSON 編碼前 |
json_encode() | 將陣列/物件轉為 JSON 字串 | API 回傳、前端資料交換 |
json_decode($str, true) | 將 JSON 轉為關聯陣列(true 參數關鍵) | 接收前端 AJAX 資料 |
stripcslashes() 直接 addslashes(),導致資料庫存入 \\\",前端顯示亂碼。json_encode() 會變成 \uXXXX 逃逸序列,雖合法但增加傳輸體積。json_decode 第二參數:預設回傳 stdClass 物件,習慣陣列操作的開發者務必加 true 取得關聯陣列。<?php // 1. 接收表單資料 $raw = $_POST['content'] ?? ''; // 2. 清理後存入資料庫 $clean = stripcslashes($raw); $safe = addslashes($clean); // PDO prepared statement 寫入... // 3. 讀取後準備 JSON 回傳 $fromDb = $stmt->fetchColumn(); // 假設已查詢 $original = stripcslashes($fromDb); $payload = ['content' => $original]; $json = json_encode($payload, JSON_UNESCAPED_UNICODE); $response = addslashes($json); // 若直接輸出到 JS 變數中 echo $response; ?>
處理特殊字元的核心原則是:「入庫前轉義、出庫後還原、JSON 編碼前再轉義」。配合 PDO 預處理語句(Prepared Statements)可進一步杜絕 SQL 注入風險,建立安全、可維護的 PHP 應用程式。