ASP 以逗號自動串接同名欄位(Request("field") = "val1,val2,val3"),PHP 預設覆蓋。前端表單散佈數十個站點,無法統一修改 name="field[]",需後端相容。
php.ini 無相關選項僅對少數高流量站點改為 name="field[]",後端以 input_treat() 統一處理:
function input_treat($input) {
if (gettype($input) == "string") {
return htmlentities(trim($input), ENT_QUOTES);
} elseif (gettype($input) == "array") {
$nd = "";
foreach ($input as $v) {
$nd .= htmlentities(trim($v), ENT_QUOTES) . " ";
}
return $nd;
}
return false;
}
$value = input_treat($_POST['field']);
// 字串直接過濾;陣列以空格串接後過濾
// 統一回傳安全字串,後續邏輯無需判斷型別
| 優點 | 缺點 |
|---|---|
| 最小化前端修改 統一輸出格式 內建 XSS 過濾 |
仍需部份站點改前端 空格分隔不如逗號標準 無法區分原始空格與分隔符 |
若專案允許部署 auto_prepend_file,可在入口處統一重寫 $_POST:
// auto_prepend_file.php
if ($_SERVER['REQUEST_METHOD'] === 'POST'
&& strpos($_SERVER['CONTENT_TYPE'], 'application/x-www-form-urlencoded') === 0) {
parse_str(file_get_contents('php://input'), $parsed);
// 將陣列值以逗號合併
array_walk_recursive($parsed, function(&$v, $k) {
if (is_array($v)) $v = implode(',', $v);
});
$_POST = $parsed;
}
完全零前端修改、零業務程式碼入侵,推薦用於大型遷移專案。
ASP 轉 PHP 的同名欄位相容問題,核心在於「前端不可改」與「後端預設行為不同」的衝突。input_treat() 為快速折衷方案;auto_prepend_file + php://input 則是徹底解法,視專案規模與權限選擇。