URL 中 # 為片段識別符,瀏覽器不會傳送至伺服器,導致 PHP $_GET 截斷參數。解決方案:客戶端使用 escape() 編碼後傳遞,伺服端自動解碼。
問題演示
// c.php
echo $_GET['key'];
c.php?key=999 → 輸出 999
c.php?key=9#888 → 輸出 9(#888 被瀏覽器截斷)
解決方案:JS escape() 編碼
查詢
編碼對照
| 原始字元 | escape() 結果 |
| # | %23 |
| & | %26 |
| = | %3D |
| 空格 | %20 |
| 中文 | %uXXXX |
PHP $_GET 會自動 urldecode(),伺服端直接獲得完整字串 9#888。
現代替代方案
// 推薦使用 encodeURIComponent(RFC 3986 標準)
keys = encodeURIComponent(keys);
// escape() 已棄用,不處理 UTF-8 非 ASCII 字元
伺服端驗證
$key = $_GET['key'];
// 進一步驗證格式、長度、字元集...
if (preg_match('/^[a-zA-Z0-9#_-]{1,50}$/', $key)) { /* ... */ }
總結
- 客戶端編碼 → 伺服端自動解碼
- 優先使用
encodeURIComponent()
- 伺服端仍需驗證輸入合法性
此技巧適用於所有含特殊符號的 GET 參數傳遞場景。
- 上一篇文章: PHP 輸入流 php://input 使用淺析:獲取原始 POST 資料與檔案上傳應用
- 下一篇文章: PHP 面試高頻 11 題精選:從基礎概念到實務陷阱的標準回答指南
Copyright ©
程式碼之家 All Rights Reserved