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

JSON 字串傳遞至 PHP 後端處理:stripslashes 解決 magic_quotes_gpc 歷史遺留問題

     編輯:PHP 綜合知識

問題現象

前端傳送標準 JSON:[{"a":1,"b":"test"}]
PHP 接收到:[{"a":1,"b":"test"}](單引號被跳脫為 \')
導致 json_decode() 失敗或解析錯誤。

根本原因

PHP 設定 magic_quotes_gpc = On(PHP 5.4 前預設開啟),自動對 $_GET、$_POST、$_COOKIE 執行 addslashes()。
此特性已於 PHP 5.4 移除,但舊環境或特定主機可能仍啟用。

解決方案

$json = $_POST['content']; // 或 file_get_contents('php://input')

// 相容處理:檢測並移除魔術引號
if (get_magic_quotes_gpc()) {
    $json = stripslashes($json);
}

$data = json_decode($json, true); // 解析為關聯陣列
if (json_last_error() !== JSON_ERROR_NONE) {
    // 處理解析錯誤
    throw new Exception('JSON 格式錯誤: ' . json_last_error_msg());
}

現代最佳實踐(PHP 5.5+)

// 直接讀取原始輸入流,繞過 $_POST 自動解析與 magic_quotes
$json = file_get_contents('php://input');
$data = json_decode($json, true);
  • php://input 取得原始 POST 資料,不受 magic_quotes_gpc 影響
  • 不支援 multipart/form-data(檔案上傳),僅適用 application/json、text/plain
  • 記憶體效率優於 $GLOBALS['HTTP_RAW_POST_DATA'](已棄用)

前端傳送注意事項

// jQuery
$.ajax({
    url: '/api/endpoint',
    method: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify([{a:1,b:'test'}]),
    success: function(res) { ... }
});

// 原生 fetch
fetch('/api/endpoint', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify([{a:1,b:'test'}])
});

總結建議

  1. 升級 PHP ≥ 5.4,徹底移除 magic_quotes_gpc 困擾
  2. 2. 後端統一用 file_get_contents('php://input') 接收 JSON 3. 前端設定 Content-Type: application/json 4. 解析後檢查 json_last_error(),提供明確錯誤回饋 5. 若必須相容舊環境,保留 get_magic_quotes_gpc() + stripslashes() 防禦性編碼
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved