核心函數封裝
<?php
function check_form($form) {
// 若 magic_quotes_gpc 關閉,手動轉義
if (!get_magic_quotes_gpc()) {
foreach ($form as $key => $val) {
$form[$key] = addslashes($val);
}
}
return $form;
}
?>
magic_quotes 相關設定詳解
| 設定項 | 作用範圍 | 建議值 |
magic_quotes_gpc | 請求開始時(GET/POST/COOKIE) | Off(PHP 5.4+ 已移除) |
magic_quotes_runtime | 運行期(檔案讀取、exec()、SQL 結果) | Off |
magic_quotes_sybase | 單引號轉義方式('' vs \') | Off |
為什麼應關閉 magic_quotes?
- 可攜性: 開啟/關閉導致程式碼行為不一致
- 效能: 所有輸入強制轉義,浪費資源
- 困擾: 需配對
stripslashes() 還原,易漏處理
- PHP 6/7 已移除: 官方認定為錯誤設計
現代最佳實踐
php.ini 確保三項皆 Off
- 資料庫操作使用預處理語句(PDO/MySQLi),根本不需手動轉義
- 輸出到 HTML 時用
htmlspecialchars() 防 XSS
- 若必須相容舊環境,用統一輸入過濾器處理:
<?php
if (get_magic_quotes_gpc()) {
$strip = function($v) {
return is_array($v) ? array_map($strip, $v) : stripslashes($v);
};
$_GET = $strip($_GET);
$_POST = $strip($_POST);
$_COOKIE = $strip($_COOKIE);
$_REQUEST = $strip($_REQUEST);
}
?>
補充:關閉錯誤顯示
error_reporting(0); // 生產環境建議配合 log_errors=On, error_log=路徑