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

PHP JSON 字串特殊字元處理完整指南:單引號、雙引號與反斜線

     編輯:PHP 相關知識

前言:表單資料提交的安全隱憂

在 Web 開發中,表單透過 POST 或 GET 方式送資料到後端是再常見不過的操作。然而,當使用者輸入包含雙引號 "、單引號 ' 或反斜線 \ 等特殊字元時,若處理不當,極易導致資料儲存錯誤、JSON 解析失敗,甚至引發安全漏洞。本文將系統整理 PHP 處理這類特殊字元的最佳實踐,幫助開發者建立穩健的資料流程。

PHP 版本演進與魔術引號的廢棄

早期 PHP(5.3 之前)若在 php.ini 啟用 magic_quotes_gpc = On,會自動對 $_GET、$_POST、$_COOKIE 資料執行 addslashes() 轉義。但此機制因副作用過多(如重複轉義、影響非資料庫操作),已於 PHP 5.3 棄用、5.4 移除。現代 PHP 專案必須自行負責轉義邏輯,不可仰賴已移除的功能。

標準資料處理流程:四步驟法

針對表單提交資料,建議遵循以下標準化流程:

  1. 清理輸入:先以 stripcslashes() 移除可能已存在的反斜線,避免雙重轉義。
  2. 轉義存儲:使用 addslashes() 將特殊字元加上反斜線,安全寫入資料庫。
  3. 讀取還原:從資料庫撈資料後,再次以 stripcslashes() 還原原始字串。
  4. JSON 輸出:對需回傳前端的資料執行 json_encode(),再以 addslashes() 二次轉義,確保 JavaScript 安全解析。

關鍵函數對照表

函數用途典型使用時機
addslashes()在特殊字元前加反斜線寫入資料庫前、JSON 輸出前
stripcslashes()移除 addslashes() 加上的反斜線讀取資料庫後、JSON 編碼前
json_encode()將陣列/物件轉為 JSON 字串API 回傳、前端資料交換
json_decode($str, true)將 JSON 轉為關聯陣列(true 參數關鍵)接收前端 AJAX 資料

常見錯誤與避坑指南

  • 雙重轉義:未先 stripcslashes() 直接 addslashes(),導致資料庫存入 \\\",前端顯示亂碼。
  • 編碼不一致:資料庫、PHP 檔案、HTML 頁面編碼必須統一為 UTF-8,否則中文經 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 應用程式。

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